Как мне сообщить Joda Time, что время, которое я даю, указано для определенного смещения часового пояса c, даже если смещение не указано в строке? - PullRequest
1 голос
/ 11 февраля 2020

Я работаю с API, который предоставляет мне поле ModifyDate, которое дается в CST (-06: 00), но при передаче строки во время Joda и установке часового пояса в America / Phoenix, Joda time считает, что дата / время, которые я дал, указаны в часовом поясе UT C, поскольку API не предоставляет информацию о смещении (возвращаемое время указано в CST, что подтверждается разработчиками).

Примечание: я нахожусь в Аризоне, где мы не распознаем летнее время, поэтому я не могу просто применить смещение stati c -1 часа.

Вот пример с чем я имею дело:

Поле, возвращаемое API:

"modifyDate": "2020-02-11T12:23:39.817Z"

Попытка отформатировать дату с временем Joda:

DateTime time1 = new DateTime("2020-02-11T12:23:39.817Z", DateTimeZone.forID("CST6CDT"));
System.out.println(time1);

DateTime time2 = new DateTime(time1, DateTimeZone.forID("America/Phoenix"));
System.out.println(time2);

System.out.println("----------------------------");

DateTime time3 = DateTime.parse("2020-02-11T12:23:39.817Z");
System.out.println(time3);
System.out.println(time3.toInstant());
System.out.println(time3.withZone(DateTimeZone.forID("America/Phoenix")));
System.out.println(time3.toDateTimeISO());
System.out.println(time3.toDate());

System.out.println("--------------------------------");

Выход:

2020-02-11T06:23:39.817-06:00
2020-02-11T05:23:39.817-07:00
----------------------------
2020-02-11T12:23:39.817Z
2020-02-11T12:23:39.817Z
2020-02-11T05:23:39.817-07:00
2020-02-11T12:23:39.817Z
Tue Feb 11 05:23:39 MST 2020
--------------------------------

Как видно из первых двух выходов, при попытке применить часовой пояс для CST предоставленное время смещено на -6 (ожидается, если предоставленное время было в UT C). При установке часового пояса Америка / Феникс смещение составляет -7 (также ожидается). Однако, как я уже говорил, время, которое я передаю в DateTime, составляет , а не UT C, это CST.

Как я могу сказать DateTime (или даже какую-то другую библиотеку, это важно) что время предоставляется в CST? Опять же, учитывая, что при переходе на летнее время необходимо корректно управлять смещением.

1 Ответ

1 голос
/ 12 февраля 2020

В этом случае время, предоставляемое API, неправильно указывалось как UT C, даже если время указано в CST, как указано OleV.V. Самым чистым решением этой проблемы было использование DateTime.withZoneRetainFields (), как упомянуто shmosel.

Однако по какой-то причине, если я создал объект DateTime с помощью конструктора, я не смог бы отрегулировать время зона с withZoneRetainFields (), вместо этого мне пришлось использовать DateTime.parse ().

Я настроил для отключения часового пояса, используя следующие логики c:

DateTime time4 = DateTime.parse("2020-02-11T12:23:39.817Z").withZoneRetainFields(DateTimeZone.forID("CST6CDT"));
System.out.println(time4);
System.out.println(time4.withZone(DateTimeZone.forID("America/Phoenix")));

Вывод (правильный)

2020-02-11T12:23:39.817-06:00
2020-02-11T11:23:39.817-07:00

Надеюсь, это поможет кому-то еще, если они столкнутся с той же проблемой.

...