Проблема представления полуночи 01 мая 1921 года java.util.Date class - PullRequest
3 голосов
/ 23 октября 2009

Я хочу представлять полночь классом java.util.Date. Чтобы проверить это, я вывел это значение и получил неожиданный результат.

Код следует:

Calendar calendar = new GregorianCalendar(1921, 4, 1, 0, 0);
Date date2 = calendar.getTime();
System.out.println(date2);

Я получаю следующий вывод:

Sun May 01 00:20:08 EET 1921

Но я ожидаю получить

Sun May 01 00:00:00 EET 1921

В чем причина такого поведения?

В настоящее время я тестирую свой код в часовом поясе Европы / Хельсинки.

Ответы [ 4 ]

11 голосов
/ 23 октября 2009

Почему бы вам просто не проверить историю часовых поясов для вашей страны? Вы задали похожий вопрос всего несколько дней назад. В Финляндии был очень странный часовой пояс GMT + 1: 39: 52 до 30 апреля 1921 года. С 1 мая они переключились на GMT + 2: 00 и прыгнули с 23:59:59 до 00: 20: 08.

3 голосов
/ 23 октября 2009

К счастью, мой тестовый код все еще был у меня под рукой; -)

public static void main(String[] args) {
    Calendar calendar = new GregorianCalendar(TimeZone.getTimeZone("Europe/Helsinki"));
    calendar.set(1921,4, 1, 0, 0);
    Date date2 = calendar.getTime();
    System.out.println("GregorianCalendar: " + date2);

    DateTime c2 = new DateTime(DateTimeZone.forID("Europe/Helsinki")).withYear(1921).
            withMonthOfYear(5).withDayOfMonth(1).withHourOfDay(0). withMinuteOfHour(0).withSecondOfMinute(0).withMillisOfSecond(0);
    System.out.println("Joda: " + c2);
}

дает

GregorianCalendar: Sat Apr 30 23:20:43 CEST 1921
Exception in thread "main" org.joda.time.IllegalFieldValueException: Value 0 for minuteOfHour is not supported: Illegal instant due to time zone offset transition: 1921-05-01T00:00:35.781 (Europe/Helsinki)
    at org.joda.time.chrono.ZonedChronology$ZonedDateTimeField.set(ZonedChronology.java:469)
    at org.joda.time.DateTime.withMinuteOfHour(DateTime.java:1485)
1 голос
/ 23 октября 2009

На самом деле многие часовые пояса дают странный результат до октября 1979 года. Я предлагаю вам взглянуть на Joda время, если вы хотите точные исторические временные зоны.

По некоторым причинам наихудший день - 1 января 1900 года. Попробуйте

Calendar calendar = new GregorianCalendar(1900, 1, 1, 0, 0);
Date date2 = calendar.getTime();
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
System.out.println("Time in UTC is " + date2);

for (String tz : TimeZone.getAvailableIDs()) {
    TimeZone.setDefault(TimeZone.getTimeZone(tz));
    String dateToString = date2.toString();
    if (dateToString.contains(":00:00")) continue;
    if (dateToString.contains(":30:00")) continue;
    System.out.println(tz + ' ' + dateToString);
}

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

0 голосов
/ 23 октября 2009

Upvote to jarnbjo выше, поможет ли Joda-Time решить любые ваши проблемы?

Библиотеки Java Date / Time / Calendar иногда ломаются.

...