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