Я новичок в 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.
Возможный дубликат Дата в формате Android с часовым поясом
К вашему сведению, ужасно неприятные старые классы даты и времени, такие как java.util.Date, java.util.Calendar и java.text.SimpleDateFormat, теперь являются наследие, вытесненными классами java.time, встроенными в Java 8 и новее. См. Руководство от Oracle.
@jsDevia Этот вопрос, который вы связали, не является дубликатом. (а) Это Android, это Java. (b) Этот вопрос касается только текстового формата с использованием offset-from-UTC, в то время как этот спрашивает имя часового пояса в дополнение к смещению.
Я рекомендую вам избегать класса SimpleDateFormat. Это не только давно устарело, но и доставляет немало хлопот. Сегодня у нас намного лучше в java.time, современный API даты и времени Java.
Ваша настоящая проблема - как преобразовать старомодный объект Date в современный ZonedDateTime? (Для этого не нужно выполнять форматирование и синтаксический анализ.)




Используйте гггг-ММ-дд'Т'ЧЧ: мм: ссХХХ, чтобы напечатать время как 2017-11-23T23: 43: 45-05: 00, и для [America / New_York] нет спецификатора формата. Вы можете использовать [zzzz], который будет печататься как [Eastern Standard Time], а не как [America / New_York]
Хорошо спасибо! А как мне получить [America / New_York] в android?
@Johnnyboy Вы используете java.time.ZonedDateTime, если на вашем Android установлена Java 8, или ThreeTen Android Backport, если нет.
Данное смещение может соответствовать более чем одному имени, например, 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.
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 определяет множество практических форматов для представления значений даты и времени в виде удобочитаемого текста. Первый фрагмент желаемого формата - это один из таких стандартных форматов:
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 8 и новее. Эти классы заменяют неудобные старые классы даты и времени наследие, такие как java.util.Date, Calendar, & SimpleDateFormat.
Проект Джода-Тайм, теперь в Режим технического обслуживания, советует перейти на классы java.time.
Чтобы узнать больше, см. Учебник Oracle. И поищите в Stack Overflow множество примеров и объяснений. Спецификация - JSR 310.
Вы можете обмениваться объектами java.time напрямую с вашей базой данных. Используйте Драйвер JDBC, совместимый с JDBC 4.2 или новее. Нет необходимости в строках, нет необходимости в классах java.sql.*.
Где взять классы java.time?
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является испытательной площадкой для возможных будущих дополнений к java.time. Здесь вы можете найти несколько полезных классов, таких как Interval, YearWeek, YearQuarter и более.