Летнее время Java не работает в далеком прошлом. - PullRequest
3 голосов
/ 29 августа 2011

Следующий фрагмент кода:

TimeZone.getTimeZone("Europe/Athens").inDaylightTime(new Date(200, 8, 14));

возвращает true, так же, как это происходит в 2011 году. Однако Летнее время (DST) было предложено только 100лет или около того, и применяется еще недавно.Время в 200 году считается летним или это причуды Java?

Ответы [ 4 ]

6 голосов
/ 29 августа 2011

Вы ошибаетесь.Он работает, как и ожидалось, когда вы используете дату new Date(-1700, 8, 14) (год 200).Используемый вами конструктор добавляет 1900 к вашему году.Вы на самом деле используете год 2100.

Проверьте конструктор даты api.

3 голосов
/ 29 августа 2011

Зависит от базы данных часовых поясов. Некоторые локали поставляются со смехотворно подробными временными инструкциями (такими как запись 8-минутных изменений в смещениях UTC еще в 1800-х годах), тогда как другие довольны тем, что они полезны для времен, достаточно близких к дате их создания - возможно, потому, что компилятор База данных не имела легкого доступа к информации о том, когда была создана текущая схема, и о том, что было до нее, и поэтому закодировала ее как «применимо ко всем временам до того-то и того-то».

1 голос
/ 29 августа 2011

Дата тестирования:

14 сентября, 21:00, 00:00

Не в прошлом, а в будущем!Чтобы напечатать точную дату, попробуйте набрать

DateFormat.getDateTimeInstance( DateFormat.MEDIUM, DateFormat.SHORT).format(new Date(200, 8, 14))

0 голосов
/ 02 января 2014

Ради интереса я попробовал это в Joda-Time 2.3 с Java 7. Похоже, он работает правильно.

// © 2013 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so.
// import org.joda.time.*;
// import org.joda.time.format.*;

DateTime dateTime = new DateTime( 200, 8, 14, 0, 0, 0, DateTimeZone.forID( "Europe/Athens" ) );
boolean isDST = !( DateTimeZone.forID( "Europe/Athens" ).isStandardOffset( dateTime.getMillis() ) );

Дамп на консоль ...

System.out.println( "dateTime: " + dateTime );
System.out.println( "isDST: " + isDST );

При запуске ...

dateTime: 0200-08-14T00:00:00.000+01:34:52
isDST: false
...