DateTime времени Joda преобразован в java.util. Дата странная проблема - PullRequest
10 голосов
/ 29 февраля 2012

Я столкнулся со странной проблемой.Вот фрагмент кода, который описывает это:

DateTimeZone dtz = DateTimeZone.forOffsetHours(0);

DateTime dt = new DateTime(dtz);

System.out.println(dt);
System.out.println(dt.toDate());

вывод:

2012-02-29T17:24:39.055Z
Wed Feb 29 19:24:39 EET 2012

Я нахожусь в UTC + 2, но это действие должно создать Java.Объект util.Date, который инициализируется для времени UTC.Чего мне не хватает?

Ответы [ 3 ]

20 голосов
/ 29 февраля 2012

Date не вообще не знает о часовом поясе - он представляет только момент времени (как у Joda Time типа Instant).Со времени Unix прошло всего несколько миллисекунд.Когда вы звоните Date.toString(), он всегда использует местный часовой пояс системы для преобразования его в читаемую текстовую форму.

Так что в этом нет ничего плохого - просто ошибка ожидания по сравнению с либо значение java.util.Date , либо его toString() поведение, либо и то и другое.

(В качестве отступления предпочтите DateTimeZone.UTC, а не создание своегособственный.)

9 голосов
/ 26 июля 2013

Чтобы получить JDK Date, который соответствует Joda DateTime, сначала преобразуйте в LocalDateTime.

Как объяснено в других ответах, время в миллисекундах не меняется в зависимости от часового пояса:

DateTime local = DateTime.now()
Date localJDK = local.toDate()
assert localJDK.getTime() == local.toInstant().getMillis()

DateTime differentTimeZone = DateTime.now(DateTimeZone.forID('America/Chicago'))
Date localJDK2 = differentTimeZone.toDate()
assert differentTimeZone.toInstant().getMillis() == localJDK2.getTime()
assert localJDK.getTime() == localJDK2.getTime()

Преобразование LocalDateTime в Date изменит это:

Date differentTimeZoneJDK = differentTimeZone.toLocalDateTime().toDate()
assert localJDK.getTime() != differentTimeZoneJDK.getTime()
4 голосов
/ 18 июня 2013

Вам нужно следующее поведение:

Дата jdkDate = new SimpleDateFormat ("гггг-ММ-дд ЧЧ: мм: сс"). Parse (dt.toString ("гггг-ММ-дд ЧЧ:mm: ss "));

Как отметил Джон, дата JDK не зависит от часового пояса.Надеюсь, это кому-нибудь поможет.

...