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

Теперь мой вопрос: правильно ли я прав или неправильно?

Ответ 1

Вы не установили часовой пояс, только добавили Z к концу даты/времени, поэтому он будет выглядеть как дата/время по Гринвичу, но это не изменит значение.

Установите часовой пояс в GMT и он будет правильным.

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));

Ответ 2

'T' и 'Z' рассматриваются здесь как константы. Вам нужно передать Z без кавычек. Кроме того, вам нужно указать часовой пояс во входной строке.

Пример: 2013-09-29T18:46:19-0700 И формат как "yyyy-MM-dd'T'HH:mm:ssZ"

Ответ 3

От объекта ISO 8601 до объекта Date 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 Date до строки 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

Ответ 4

ЕСЛИ вы хотите обработать "стандарт" JSON-представление даты, тогда лучше использовать этот шаблон: "yyyy-MM-dd'T'HH:mm:ssX".

Обратите внимание на X в конце. Он будет обрабатывать временные интервалы в стандарте ISO 8601, а ISO 8601 - это именно то, что производит этот оператор в Javascript new Date().toJSON()

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

  • Вам не нужно, чтобы ваши клиенты отправляли дату в GMT
  • Вам не нужно явно преобразовывать объект Date в GMT, используя это: sdf.setTimeZone(TimeZone.getTimeZone("GMT"));

Ответ 5

ТЛ; др

Другие ответы устарели, начиная с 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.time

Старые классы java.util.Date/.Calendar и java.text.SimpleDateFormat были вытеснены фреймворком java.time, встроенным в Java 8 и более поздние версии. Смотрите учебник. Избегайте старых классов, так как они оказались плохо спроектированными, запутанными и хлопотными.

Часть плохого дизайна в старых классах укусила вас, когда метод toString применяет текущий часовой пояс JVM по умолчанию при генерации текстового представления значения даты и времени, которое фактически находится в UTC (GMT); из лучших побуждений, но сбивает с толку.

Классы java.time по умолчанию используют форматы ISO 8601 при разборе/создании текстовых представлений значений даты и времени. Поэтому нет необходимости указывать шаблон разбора.

Instant - это момент времени на UTC.

Instant instant = Instant.parse( "2013-09-29T18:46:19Z" );

Вы можете применить часовой пояс по мере необходимости для создания ZonedDateTime объекта.

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( zoneId );

Table of date-time types in Java, both modern and legacy

Ответ 6

и если у вас нет возможности использовать java8 лучше использовать 'yyyy-MM-dd'T'HH: mm: ssX XX', так как это снова корректно обрабатывается (хотя с одним X это может быть не так... в зависимости от вашей функции синтаксического анализа)

X генерирует: +01

XXX генерирует: +01: 00