Как получить формат даты с часовым поясом в Java

Я новичок в java. Я хотел бы получить этот формат даты с часовым поясом в тексте в конце.

2017-11-23T23:43:45-05:00[America/New_York]

На данный момент у меня есть это, я также хотел бы добавить часовой пояс пользователя по умолчанию в качестве часового пояса в конце там. Вот что у меня сейчас есть:

SimpleDateFormat trust = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.getDefault());

Что дает мне (пример):

2018-08-17T22:39:39-0400

@ADM Этому ответу более 5 лет, и он рекомендует Joda Time. Все функциональные возможности Joda Time уже довольно давно присутствуют в стандартной библиотеке Java.

Jim Garrison 18.08.2018 05:07

Возможный дубликат Дата в формате Android с часовым поясом

jsDevia 18.08.2018 05:39

К вашему сведению, ужасно неприятные старые классы даты и времени, такие как java.util.Date, java.util.Calendar и java.text.SimpleDateFormat, теперь являются наследие, вытесненными классами java.time, встроенными в Java 8 и новее. См. Руководство от Oracle.

Basil Bourque 18.08.2018 09:06

@jsDevia Этот вопрос, который вы связали, не является дубликатом. (а) Это Android, это Java. (b) Этот вопрос касается только текстового формата с использованием offset-from-UTC, в то время как этот спрашивает имя часового пояса в дополнение к смещению.

Basil Bourque 18.08.2018 09:08

Я рекомендую вам избегать класса SimpleDateFormat. Это не только давно устарело, но и доставляет немало хлопот. Сегодня у нас намного лучше в java.time, современный API даты и времени Java.

Ole V.V. 18.08.2018 09:40

Ваша настоящая проблема - как преобразовать старомодный объект Date в современный ZonedDateTime? (Для этого не нужно выполнять форматирование и синтаксический анализ.)

Ole V.V. 18.08.2018 09:43
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
7
6 220
4

Ответы 4

Используйте гггг-ММ-дд'Т'ЧЧ: мм: ссХХХ, чтобы напечатать время как 2017-11-23T23: 43: 45-05: 00, и для [America / New_York] нет спецификатора формата. Вы можете использовать [zzzz], который будет печататься как [Eastern Standard Time], а не как [America / New_York]

Хорошо спасибо! А как мне получить [America / New_York] в android?

user10217397 18.08.2018 04:57

@Johnnyboy Вы используете java.time.ZonedDateTime, если на вашем Android установлена ​​Java 8, или ThreeTen Android Backport, если нет.

Andreas 18.08.2018 05:51

Данное смещение может соответствовать более чем одному имени, например, UTC-0500 может быть America/New_York, или America/Toronto, или America/Montreal, или America/Nassau (возможно, их больше). Чтобы выбрать правильный, потребуется более точная географическая информация, а «правильный» может зависеть и от других факторов.

Вот почему нет простого API для возврата этого значения, нет канонического правильного ответа. Вам нужно будет определить свои собственные правила для определения строки, а затем использовать базу данных TZ для ее получения.

Это помогает

DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ssZZ") .withLocale(Locale.ENGLISH);

Джода-Тайм? Вариант, хотя большинство считает, что его замена, java.time, лучше. Доступно на (более старых) Android через ThreeTenABP.

Ole V.V. 18.08.2018 09:39

tl; dr

ZonedDateTime                        // Represent a moment as seen in the wall-clock time used by the people of a particular region (a time zone). 
.now(                                // Capture the current moment.
    ZoneId.of( "America/New_York" )  // Specify the time zone through whose wall-clock time we want to perceive the current date and time.
)                                    // Returns a `ZonedDateTime` object.
.toString()                          // Generate text in standard ISO 8601 format extended to append the name of the time zone in square brackets.

2017-11-23T23:43:45-05:00[America/New_York]

ISO 8601

Стандарт ISO 8601 определяет множество практических форматов для представления значений даты и времени в виде удобочитаемого текста. Первый фрагмент желаемого формата - это один из таких стандартных форматов:

2017-11-23T23:43:45-05:00

Желаемый формат расширяет стандартный формат, добавляя имя часового пояса в квадратных скобках.

2017-11-23T23:43:45-05:00[America/New_York]

Этот расширенный стандартный формат в точности соответствует поведению метода ZonedDateTime::toString. Вы найдете этот класс в комплекте с Java.

ZonedDateTime.now().toString()  // Generate text in standard ISO 8601 format extended to append the name of the time zone in square brackets.

Избегайте устаревших классов даты и времени

Класс SimpleDateFormat является частью проблемных старых классов даты и времени, которые несколько лет назад были вытеснены классами java.time. Никогда не используйте эти ужасные устаревшие классы.

ZonedDateTime

Получите текущий момент по времени на настенных часах, используемому людьми из определенного региона (часового пояса).

Укажите правильное название часового пояса в формате continent/region, например America/Montreal, Africa/Casablanca или Pacific/Auckland. Никогда не используйте аббревиатуры из 3-4 букв, такие как EST или IST, поскольку они являются истинными часовыми поясами нет, не стандартизированы и даже не уникальны (!).

ZoneId z = ZoneId.of( "America/New_York" ) ;
ZonedDateTime zdt = ZonedDateTime.now( z ) ;

Создайте объект String, содержащий текст в желаемом формате.

String output = zdt.toString() ;  // Generate text in standard ISO 8601 format extended to append the name of the time zone in square brackets.

О java.time

Фреймворк java.time встроен в Java 8 и новее. Эти классы заменяют неудобные старые классы даты и времени наследие, такие как java.util.Date, Calendar, & SimpleDateFormat.

Проект Джода-Тайм, теперь в Режим технического обслуживания, советует перейти на классы java.time.

Чтобы узнать больше, см. Учебник Oracle. И поищите в Stack Overflow множество примеров и объяснений. Спецификация - JSR 310.

Вы можете обмениваться объектами java.time напрямую с вашей базой данных. Используйте Драйвер JDBC, совместимый с JDBC 4.2 или новее. Нет необходимости в строках, нет необходимости в классах java.sql.*.

Где взять классы java.time?

  • Java SE 8, Java SE 9, Java SE 10, Java SE 11 и более поздние версии - часть стандартного Java API с объединенной реализацией.
    • В Java 9 добавлены некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 7
    • Большая часть функциональности java.time перенесена на Java 6 и 7 в ThreeTen-Backport.
  • Android
    • Более поздние версии Android связывают реализации классов java.time.
    • Для более ранних версий Android (<26) проект ThreeTenABP адаптирует ThreeTen-Backport (упомянутый выше). См. Как использовать ThreeTenABP….

Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является испытательной площадкой для возможных будущих дополнений к java.time. Здесь вы можете найти несколько полезных классов, таких как Interval, YearWeek, YearQuarter и более.

Другие вопросы по теме