У меня есть конструктор SimpleDateFormat как
SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'")
и я разбираю строку "2013-09-29T18:46:19Z".
Я читал, что здесь Z представляет GMT/UTC
часовой пояс. но когда я печатаю эту дату на консоли, она печатает IST timezne для возвращенной даты.
Теперь мой вопрос, является ли мой вывод правильным или неправильным?
java
date
timezone
date-format
simpledateformat
Прадип Борде
источник
источник
Ответы:
Вы не установили часовой пояс, добавленный только
Z
к концу даты / времени, поэтому он будет выглядеть как дата / время по Гринвичу, но это не изменит значения.Установите часовой пояс на GMT, и он будет правильным.
источник
'T'
и'Z'
рассматриваются здесь как константы. Вам нужно пройтиZ
без кавычек. Кроме того, вам необходимо указать часовой пояс во входной строке.Пример:
2013-09-29T18:46:19-0700
и формат как"yyyy-MM-dd'T'HH:mm:ssZ"
источник
-0700
это часовой пояс, т.е. -7: 00 часовОт строки ISO 8601 до объекта даты Java
если вы не установите,
TimeZone.getTimeZone("GMT")
то он выведетSun Sep 29 18:46:19 CST 2013
От объекта даты Java к строке ISO 8601
И для преобразования
Date
объекта в ISO 8601 Standard (yyyy-MM-dd'T'HH:mm:ss'Z'
) используйте следующий кодТакже обратите внимание, что без
' '
Zyyyy-MM-dd'T'HH:mm:ssZ
печатает2015-01-22T03:41:02+0000
источник
Если вы хотите обработать « стандартный » JSON представление Дата , то лучше использовать этот шаблон:
"yyyy-MM-dd'T'HH:mm:ssX"
.Обратите внимание
X
на конец. Он будет обрабатывать часовые пояса в стандарте ISO 8601 , и именно ISO 8601 создает именно это утверждение в Javascriptnew Date().toJSON()
По сравнению с другими ответами у него есть некоторые преимущества:
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
источник
play
автоматическое связывание форм и использую@Format.DateTime
аннотации. Использовать шаблон по умолчаниюZ
в конце кажется неправильным. После того, как изменился наX
, это работает. Большое спасибоТЛ; др
Другие ответы устарели с Java 8.
ISO 8601
Ваш формат строки соответствует ISO 8601 . Этот стандарт определяет разумные форматы для представления различных значений даты и времени в виде текста.
java.time
Старые
java.util.Date
/.Calendar
иjava.text.SimpleDateFormat
классы были вытеснены фреймворком java.time, встроенным в Java 8 и более поздние версии. Смотрите учебник . Избегайте старых классов, поскольку они оказались плохо продуманными, запутанными и хлопотными.Часть плохого дизайна в старых классах укусила вас, когда
toString
метод применяет текущий часовой пояс JVM по умолчанию при генерации текстового представления значения даты и времени, которое фактически находится в UTC (GMT); из лучших побуждений, но сбивает с толку.Классы java.time по умолчанию используют форматы ISO 8601 при разборе / создании текстовых представлений значений даты и времени. Поэтому не нужно указывать шаблон разбора.
Это
Instant
момент времени на UTC .Вы можете применить часовой пояс по мере необходимости для создания
ZonedDateTime
объекта.источник
и если у вас нет возможности перейти на java8, лучше используйте 'yyyy-MM-dd'T'HH: mm: ssX XX ', так как это снова будет правильно проанализировано (хотя с одним X это может быть не так). .. в зависимости от вашей функции синтаксического анализа)
X генерирует: +01
XXX генерирует: +01: 00
источник
Для Java 8: вы можете использовать встроенный,
java.time.format.DateTimeFormatter
чтобы уменьшить вероятность опечаток, таких какISO_ZONED_DATE_TIME представляет
2011-12-03T10:15:30+01:00[Europe/Paris]
собой один из стандартных форматов DateTime, предоставляемых по ссылке Oracleисточник