2016-06-10 7 views
0

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

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

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

Это из-за летнего времени, что означает, что мы являемся GMT + 1: 00, что, вероятно, объясняет разницу в 1 час.

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

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

Но я до сих пор путают, как это работает.

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

+1

Как вы получаете дату создания файла? Если это файлы на диске, почему бы не использовать объект 'FileTime', полученный с помощью' Files.readAttributes (путь, BasicFileAttributes.class) .creationTime() '? Из этого вы получаете «Мгновенный», который вы можете сравнить с «Instant.now»(). MinusDays (1) ', нет часовых поясов. – Tunaki

ответ

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.

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

+0

Спасибо @assylias за подробное объяснение. Теперь это начинает иметь смысл. –