java.util.Date показывает разные значения с одинаковыми входными параметрами - PullRequest
1 голос
/ 06 марта 2012

Я пытаюсь использовать System.out из тех же строк

System.out.println(" DATE 29 " + new Date(1330462800000l) + " Date 01 "
                + new Date(1330549200000l));

, но у меня разные результаты, когда я проверяю его в Build (работает в режиме консоли) и когда я запускаю приложение из eclipse.

вывод из затмения (кажется, что это правильный результат):

ДАТА 29 Ср 29 февраля 00:00:00 EET 2012 Дата 01 Чт 01 01 00:00:00 EET 2012

вывод из сборки (режим консоли)

ДАТА 29 Вторник 28 февраля 23:00:00 EET 2012 Дата 01 Ср 29 февраля 23:00:00 EET 2012

Извините за глупый вопрос, но есть ли у вас какие-либо идеи о возможных причинах?

PS: я использую maven + tycho, чтобы создать сборку eclipse-repository типа упаковки (если это действительно имеет значение)

РЕДАКТИРОВАТЬ: В Eclipse я посмотрел на значение timeZone:

Calendar calendar=Calendar.getInstance();
System.out.println("!!!time zone before: " +   calendar.getTimeZone());

!!! часовой пояс до: sun.util.calendar.ZoneInfo [id = "Европа / Минск", смещение = 7200000, dstSavings = 3600000, useDaylight = верно, переходы = 121, lastRule = java.util.SimpleTimeZone [ID = Европа / Минск, смещение = 7200000, dstSavings = 3600000, useDaylight = Truе, StartYear = 0, StartMode = 2, StartMonth = 2, startDay = -1, startDayOfWeek = 1, = 7200000 начальный промежуток, startTimeMode = 1, endMode = 2, endMonth = 9, endDay = -1, endDayOfWeek = 1, EndTime =7200000, endTimeMode = 1]]

, затем я установил часовой пояс с жестко закодированным zoneId и сделал сборку

calendar.setTimeZone(TimeZone.getTimeZone("Europe/Minsk"));

не дал никаких результатов

РЕДАКТИРОВАТЬ: я используюразные версии и архитектуры jres в build и eclipse .. Может ли это быть причиной?РЕДАКТИРОВАТЬ:

System.out.println("!!!!!! system.timezone " + System.getProperty("user.timezone"));
System.setProperty("user.timezone", "Europe/Minsk");
System.out.println("!!!!!! system.timezone " + System.getProperty("user.timezone"));

!!!!!!system.timezone Европа / Минск

!!!!!!system.timezone Европа / Минск !!! календарное время после зоны: sun.util.calendar.ZoneInfo [id = "Европа / Минск", смещение = 7200000, dstSavings = 3600000, useDaylight = true, переходы = 121, lastRule = java.util.SimpleTimeZone [ID = Европа / Минск, смещение = 7200000, dstSavings = 3600000, useDaylight = верно, StartYear = 0, StartMode = 2, StartMonth = 2, startDay = -1, startDayOfWeek = 1, = 7200000 начальный промежуток, startTimeMode = 1, endMode = 2, endMonth = 9, endDay = -1, endDayOfWeek = 1, endTime = 7200000, endTimeMode = 1]]

Правильный часовой пояс.но дата все еще неверна

Ответы [ 2 ]

1 голос
/ 06 марта 2012

Добавить к тесту:

System.out.println(Calendar.getInstance().getTimeZone());

или

System.getProperty("user.timezone");

Часовой пояс Java можно установить с помощью системного свойства user.timezone, подробности см. Свойства системы Java .

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

DateTimeZone.setDefault(DateTimeZone.UTC);
0 голосов
/ 19 января 2018

ТЛ; др

Instant.ofEpochMilli( 1_330_462_800_000L )     // Convert count-of-milliseconds-since-epoch to an `Instant`, a moment on the timeline in UTC.
       .atZone( ZoneId.of( "Europe/Minsk" ) )  // Adjust into another time zone. Same moment, different wall-clock time.

Избегайте устаревших классов даты и времени

Вы используете проблемные старые классы даты и времени, которые теперь унаследованы, заменены классами java.time. Среди многих недостатков - метод Date::toString, который позволяет использовать текущий часовой пояс JVM по умолчанию динамически при генерации строки. Date представляет собой момент в UTC, но эта благие намерения вызывают путаницу. Текущий часовой пояс JVM по умолчанию может измениться в любой момент, даже во время выполнения , поэтому вы можете увидеть различные результаты.

java.time

Используйте java.time.Instant вместо java.util.Date.

Instant

Класс Instant представляет момент на временной шкале в UTC с разрешением наносекунд (до девяти (9) цифр десятичного знака) доля).

Instant instant = Instant.ofEpochMilli( 1_330_462_800_000L ) ;

Учитесь думать и работайте в UTC, прежде всего . Представьте себе UTC как One True Time ™ . Все остальные часовые пояса - просто вариации на эту тему. Работая программистом, забудьте о вашем местном времени и прекратите переводить туда-сюда между зонами, так как это может привести вас в замешательство. Сосредоточьтесь на UTC в своем программировании и ведении журнала.

ZonedDateTime

Чтобы увидеть тот же момент через объектив другого часового пояса, примените ZoneId, чтобы получить ZonedDateTime объект. У нас все еще тот же момент, та же точка на временной шкале, но с другим временем настенных часов.

ZoneId z = ZoneId.of( "Europe/Minsk" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;

См. код, запущенный в режиме реального времени на IdeOne.com .

instant.toString (): 2012-02-28T21: 00: 00Z

zdt.toString (): 2012-02-29T00: 00 + 03: 00 [Европа / Минск]


О java.time

Фреймворк java.time встроен в Java 8 и более поздние версии. Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date, Calendar и & SimpleDateFormat.

Проект Joda-Time , который теперь находится в режиме обслуживания , рекомендует перейти на классы java.time .

Чтобы узнать больше, см. Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .

Где взять классы java.time?

  • Java SE 8 , Java SE 9 и выше
    • Встроенный.
    • Часть стандартного Java API с связанной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 7
    • Большая часть функций java.time перенесена в Java 6 и 7 в ThreeTen-Backport .
  • Android
    • Более поздние версии Android связывают реализации классов java.time.
    • Для более ранних версий Android проект ThreeTenABP адаптируется ThreeTen-Backport (упоминалось выше). См. Как использовать ThreeTenABP… .

Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти несколько полезных классов, таких как Interval, YearWeek, YearQuarter и more .

...