2018-01-23T18: 48: 32.263 + 08:00*
В Вопросе и других ответах используются проблемные старые классы даты и времени, которые теперь унаследованы и заменены классами java.time.
java.time
Современный подход использует java.время занятий.Забудьте все о ужасно запутанном классе Calendar
.
Текущий момент
Сначала получите текущий момент в UTC.Класс Instant
представляет момент на временной шкале в UTC с разрешением наносекунд (до девяти (9) цифр десятичной дроби).
Instant instant = Instant.now() ;
Часовой пояс
Настройка на другой часовой пояс.
Укажите правильное имя часового пояса в формате continent/region
, например America/Montreal
, Africa/Casablanca
или Pacific/Auckland
.Никогда не используйте 3-4-буквенные псевдозоны, такие как EST
или IST
, поскольку они не истинных часовых поясов, не стандартизированы и даже не уникальны (!)
ZoneId z = ZoneId.of( "Asia/Kuala_Lumpur" ) ; // Or "Asia/Kuching", etc.
Применение ZoneId
для создания экземпляра объекта ZonedDateTime
.И ZonedDateTime
, и Instant
представляют один и тот же момент, одну и ту же точку на временной шкале, но просматриваются через другое время настенных часов.
ZonedDateTime zdt = instant.atZone( z ) ; // Same moment, different wall-clock time.
Смещение
Еслиу вас было только смещение от UTC , такое как +08:00
, а не известный часовой пояс , вы бы использовали ZoneOffset
, чтобы получить OffsetDateTime
вместо ZoneId
& ZonedDateTime
.Но часовой пояс всегда предпочтительнее простого смещения.Зона - это история смещений, используемых людьми определенного региона.
Строки
Чтобы сгенерировать строку в стандартном формате ISO 8601 , вызовите метод toString
.
Класс ZonedDateTime
разумно расширяет стандарт, добавляя имя часового пояса в квадратных скобках.
String output = zdt.toString() ; // YYYY-MM-DDTHH:MM:SS.SSSSSSSSS[tz]
Локализуйте в соответствии с предпочтениями пользователя.Для локализации укажите:
FormatStyle
, чтобы определить, какой длины или сокращенной должна быть строка. Locale
определить (а) человеческий язык для перевода названия дня, названия месяца и т. Д. И (б) культурных норм, решающих вопросы сокращения, использования заглавных букв, пунктуации, разделителей и т. Д.
Locale l = Locale.CANADA_FRENCH;DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime (FormatStyle.FULL) .withLocale (l);Вывод строки = zdt.format (f);
Дамп на консоль.
System.out.println( "instant.toString(): " + instant ) ;
System.out.println( "output: " + output ) ;
System.out.println( "outputLocalized (always Locale.US on IdeOne.com): " + outputLocalized ) ;
См. Этот код, запущенный в режиме реального времени на IdeOne.com ,Обратите внимание, что IdeOne.com переопределяет любой параметр Locale
, чтобы всегда использовать Locale.US
.
instant.toString (): 2018-01-23T10: 48: 32.263Z
выход: 2018-01-23T18: 48: 32.263 + 08: 00 [Asia / Kuala_Lumpur]
ooutputLocalized (всегда Locale.US на IdeOne.com): вторник, 23 января 2018 г. 18:48:32 PM MYT
О java.time
Фреймворк java.time встроен в Java 8 и более поздние версии.Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date
, Calendar
, & SimpleDateFormat
.
Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на классы java.time .
Чтобы узнать больше, см. Oracle Tutorial .И поиск переполнения стека для многих примеров и объяснений.Спецификация: JSR 310 .
Где получить классы java.time?
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти некоторые полезные классы, такие как Interval
, YearWeek
, YearQuarter
и more .