Java8 и переход на летнее время

В настоящее время я пишу приложение, в котором мне нужно проверить, были ли какие-либо файлы, созданные до вчерашнего дня, и очистить их. В тот момент, когда я пробую следующее:

LocalDateTime today = LocalDate.now().atStartOfDay();
long todayEpoch = today.atZone(ZoneId.of("Europe/London")).toEpochSecond() * 1000;

и преобразовать миллисекунды обратно в дату (в любом онлайн-конвертере миллисекунды в дату), он говорит мне, что я отстаю на 1 час.

Это связано с переходом на летнее время, а это означает, что сейчас время по Гринвичу + 1: 00, что, вероятно, объясняет разницу в 1 час.

Чтобы решить эту проблему, мне пришлось изменить идентификатор зоны на UTC, как показано ниже:

final LocalDateTime today = LocalDate.now().atStartOfDay();
long todayEpoch = today.atZone(ZoneId.of("UTC")).toEpochSecond() * 1000;

Но я все еще не понимаю, как это работало.

Может кто-нибудь объяснить, почему?


person Vishal Jumani    schedule 10.06.2016    source источник
comment
Как вы получаете дату создания файла? Если это файлы на диске, почему бы не использовать объект FileTime, полученный с помощью Files.readAttributes(path, BasicFileAttributes.class).creationTime()? Таким образом, вы получаете Instant, который можно сравнить с Instant.now().minusDays(1), без учета часовых поясов.   -  person Tunaki    schedule 10.06.2016


Ответы (1)


LocalDateTime today = LocalDate.now().atStartOfDay();

возвращается сегодня (в вашем часовом поясе) в 00:00. Таким образом, если сегодня 10 июня 2016 г., будет возвращено 2016-06-10 00:00.

today.atZone(ZoneId.of("Europe/London"))

добавляет информацию о часовом поясе к дате, которая принимает следующий вид: 2016-06-10 00:00 Europe/London, что совпадает с моментом 2016-06-09 23:00 UTC из-за британского летнего времени.

Затем вы получаете секунды эпохи, которые представляют собой количество секунд, прошедших между 1 января 1970 года в 00:00 UTC и этим моментом.

Во втором примере вы вычисляете миллисекунды между эпохой и 2016-06-10 01:00 Europe/London или 2016-06-10 00:00 UTC.

Вам нужно решить, что вы хотите.

person assylias    schedule 10.06.2016
comment
Спасибо @assylias за подробное объяснение. Теперь это начинает обретать смысл. - person Vishal Jumani; 13.06.2016