Java SimpleDateFormat ("yyyy-MM-dd'T'HH: mm:ss'Z'") дает часовой пояс как IST
у меня есть конструктор SimpleDateFormat как
SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'")
и я разбираю строку "2013-09-29T18:46:19Z".
Я читал, что здесь Z представляет собой GMT/UTC часовой пояс. но когда я печатаю эту дату на консоли, он печатает IST timezne для возвращенной даты.
Теперь мой вопрос, Является ли результат правильным или неправильным?
6 ответов:
вы не установили часовой пояс только добавили
Zдо конца даты / времени, поэтому он будет выглядеть как дата/время GMT, но это не меняет значения.установите часовой пояс в GMT, и это будет правильно.
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
'T'и'Z'здесь рассматриваются как константы. Вам нужно пройтиZбез кавычек. Кроме того, вам нужно указать часовой пояс во входной строке.пример :
2013-09-29T18:46:19-0700А формат как"yyyy-MM-dd'T'HH:mm:ssZ"
из строки ИСО 8601 на сегодняшний день Java-объект
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); sdf.setTimeZone(TimeZone.getTimeZone("GMT")); sdf.parse("2013-09-29T18:46:19Z"); //prints-> Mon Sep 30 02:46:19 CST 2013если вы не установите
TimeZone.getTimeZone("GMT")затем он будет выводитьSun Sep 29 18:46:19 CST 2013от объекта даты Java до строки ISO 8601
и конвертировать
Dateобъект стандарту ISO 8601 (yyyy-MM-dd'T'HH:mm:ss'Z') использовать следующий кодSimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.US); sdf.setTimeZone(TimeZone.getTimeZone("GMT")); System.out.println(sdf.format(new Date())); //-prints-> 2015-01-22T03:23:26Zтакже обратите внимание, что без
' 'при 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()по сравнению с другими ответами, он имеет некоторые преимущества:
- вам не нужно требовать, чтобы ваши клиенты отправляли дату GMT
- вам не нужно явно конвертировать объект даты в GMT, используя это:
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
tl; dr
другие ответы устарели с Java 8.
Instant // Represent a moment in UTC. .parse( "2013-09-29T18:46:19Z" ) // Parse text in standard ISO 8601 format where the `Z` means UTC, pronounces “Zulu”. .atZone( // Adjust from UTC to a time zone. ZoneId.of( "Asia/Kolkata" ) ) // Returns a `ZonedDateTime` object.ISO 8601
ваша строка формата происходит в соответствии с ISO 8601 стандартные. Этот стандарт определяет разумные форматы для представления различных значений даты и времени в виде текста.
java.время
старый
java.util.Date/.Calendarиjava.text.SimpleDateFormatклассы были вытеснены java.временные рамки, встроенные в Java 8 и выше. Видеть учебник. избегайте старых классов поскольку они оказались плохо спроектированными, запутанными и хлопотными.часть плохого дизайна в старых классах укусила вас, где
toStringметод применяет текущий часовой пояс JVM по умолчанию при создании текстового представления значения даты-времени, которое фактически находится в UTC (GMT); благонамеренный, но запутанный.java.классы времени используют форматы ISO 8601 по умолчанию, когда разбор / генерация текстовых представлений значений даты-времени. Поэтому нет необходимости указывать шаблон разбора.
An
Instantмомент на временной шкале в UTC.Instant instant = Instant.parse( "2013-09-29T18:46:19Z" );вы можете применить часовой пояс по мере необходимости производить
ZonedDateTime
и если у вас нет возможности перейти на java8 лучше использовать 'yyyy-MM-dd'T'HH: mm: ssX XX ' поскольку это снова правильно анализируется (в то время как только с одним X это может быть не так... в зависимости от вашей функции разбора)
X генерирует: +01
XXX генерирует: +01: 00
Comments