Неловкое поведение создания даты Java - PullRequest
3 голосов
/ 31 мая 2011

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

Date startDate = new Date(1282863600000L);
System.out.println(startDate);

Date endDate = new Date(1321919999000L);
System.out.println(endDate);

Вывод соответственно:

Fri Aug 27 00:00:00 BST 2010
Mon Nov 21 23:59:59 GMT 2011

Кто-нибудь видел что-то подобное? Обе даты инициализируются одинаковым образом, но при печати первая отображается в BST, а последняя в GMT?

Я пытался найти объяснение этому, но не смог. Кто-нибудь может мне помочь?

Заранее спасибо!

Ответы [ 3 ]

5 голосов
/ 31 мая 2011

Это документированное поведение.

С Date.toString():

Преобразует этот объект Date в строку вида:

 dow mon dd hh:mm:ss zzz yyyy

zzz - часовой пояс (и может отражать переход на летнее время). Стандартные сокращения часовых поясов включают те, которые распознаются методом parse. Если информация о часовом поясе недоступна, то zzz пусто, то есть вообще не содержит символов.

Вы используете локаль, которая использует британское летнее время, и создаете дату, когда применяется правило перехода на летнее время. Это будет ожидаемая форма даты в то время для локального пользователя.

1 голос
/ 31 мая 2011

После прекрасного сеанса пробовать разные long значения я получил это:

Date startDate1 = new Date(1284245999999L);
Date startDate2 = new Date(1284246000000L);
System.out.println(startDate1);
System.out.println(startDate2);

Date endDate = new Date(1321919999000L);
System.out.println(endDate);

Вывод был:

Sun Sep 12 01:59:59 IDT 2010
Sun Sep 12 01:00:00 IST 2010 <-- Long value is greater, but due to DST changes, actual time is one hour earlier
Tue Nov 22 01:59:59 IST 2011

Обратите внимание, что увеличение long на 1 с 1284245999999L до 1284246000000L возвращает нас назад во времени из-за перехода от стандартного времени к летнему времени.
Вот как ведет себя вычисление времени Java - число миллисекунд с 01.01.1970 не меняется, но время, которое оно представляет, основано на часовом поясе.

1 голос
/ 31 мая 2011

Для меня вывод этого кода:

Fri Aug 27 01:00:00 CEST 2010
Tue Nov 22 00:59:59 CET 2011

Точный результат зависит от локали по умолчанию, которую Java использует в вашей системе.

Разница в том, что CESTцентральноевропейское летнее время , а CET - центральноевропейское время (т. е. не летнее время).

Вы, кажется, работаете в британской локали (en_GB или аналогичной)), поэтому ваши выходные данные показывают Британское летнее время и Среднее время по Гринвичу соответственно.

Первая указанная вами дата попадает в соответствующие летние времена, а вторая - нет.«т.Поэтому Java выбирает подходящий часовой пояс для каждой комбинации локали / времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...