Java SimpleDateFormat ("yyyy-MM-dd'T'HH: mm: ss'Z '") дає часовий пояс як IST


148

У мене є конструктор SimpleDateFormat як

SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'")

і я розбираю рядок "2013-09-29T18:46:19Z".

Я читав, що тут Z позначає GMT/UTCчасовий пояс. але коли я друкую цю дату на консолі, вона друкує IST timezne для повернутої дати.

Тепер моє запитання - чи правильний чи неправильний результат?


3
так, це те, що являє собою Z. Z- Time Zone
Вуді

5
Z = зулуський час => GMT + 0, ви, очевидно, не служили своїй країні;)
MushyPeas

Відповіді:


251

Ви не встановили часовий пояс, який додав лише a Zв кінці дати / часу, тому він буде схожий на дату / час GMT, але це значення не змінює.

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

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

3
Якщо у вас є дата, скажімо, 2012-12-06T06: 00: 00 без Z, чи це являє собою GMT?
бінаргіант

3
@binarygiant Ви повинні запитати тих, хто його надіслав. Це може бути місцевий час відправника.
Пітер Лорі

2
Часовий пояс можна встановити на "UTC"
Prashanth

2
Замість того, щоб встановити часовий пояс у такій кількості місць для різних бібліотек та уникати конфліктів із часовим поясом машини / ноутбука, завжди слід встановити часовий пояс за замовчуванням JVM, встановивши властивість системи user.timezone: java -Duser.timezone = GMT ...
kisna

100

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

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


Subir, Дякую за Вашу відповідь, але що "0700" додається до рядка введення ??
Прадіп Борде

-0700- часовий пояс, тобто -7: 00 год.
Subir Kumar Sao

12
для -07: 00 години, а не -0700 було б наступне: yyyy-MM-dd'T'HH: mm: ss.SSSXXX
Tastybrownies

48

Від ISO 8601 String до Java Date Object

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 Standard ( 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


2
Це дає мені java.text.ParseException: Нерозбірлива дата: "2018-05-01T18: 30: 00.000Z" @AZ_
Mansuu ....

41

Якщо ви хочете обробити « стандартний » JSON уявлення Дата , то краще використовувати цей шаблон: "yyyy-MM-dd'T'HH:mm:ssX".

Помітьте Xкінець. Він буде обробляти часові пояси за стандартом ISO 8601 , а ISO 8601 - саме те, що виробляє цю заяву в Javascriptnew Date().toJSON()

У порівнянні з іншими відповідями це має деякі переваги:

  1. Вам не потрібно вимагати від клієнтів надсилання дати в GMT
  2. Вам не потрібно явно перетворювати об’єкт Date в GMT за допомогою цього: sdf.setTimeZone(TimeZone.getTimeZone("GMT"));

1
Я використовую playавтоматичну прив'язку форми та використовую @Format.DateTimeанотацію. Використовувати шаблони за замовчуванням з Zв кінці здається неправильним. Після того X, як він змінився , він працює. Велике спасибі
трансанг

Якщо ваша дата вказує часовий пояс у відповідності з RFC822, наприклад "-0500", це працює чудово. Але для такої дати, як "2013-07-15T10: 22: 17-05: 00" (також діє ISO8601 TZ), ця помилка. У цьому випадку вам потрібно використовувати "yyyy-MM-dd'T'HH: mm: ssXXX".
Ламбарт

23

тл; д-р

Інші відповіді застаріли, як у 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 );

Таблиця типів дат і часу на Java, як сучасна, так і застаріла


22

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

X породжує: +01

XXX створює: +01: 00


0

Для Java 8: Ви можете використовувати вбудований, java.time.format.DateTimeFormatterщоб зменшити будь-які шанси на помилки, наприклад

DateTimeFormatter formatter = DateTimeFormatter.ISO_ZONED_DATE_TIME;

ISO_ZONED_DATE_TIME являє собою 2011-12-03T10:15:30+01:00[Europe/Paris]один із стандартних форматів DateTime у комплекті, що надається посиланням Oracle

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.