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 для возвращенной даты.



Теперь мой вопрос, Является ли результат правильным или неправильным?

620   6  

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

также обратите внимание, что без ' ' при Z yyyy-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 именно то, что производит это утверждение в Javascript new Date().toJSON()

по сравнению с другими ответами, он имеет некоторые преимущества:

  1. вам не нужно требовать, чтобы ваши клиенты отправляли дату GMT
  2. вам не нужно явно конвертировать объект даты в 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

    Ничего не найдено.