Проверьте, находятся ли два экземпляра Instant в одну и ту же дату в Java 8.

У меня есть два экземпляра класса Instant из java.time, например:

Instant instant1 = Instant.now();
Instant instant2 = Instant.now().plus(5, ChronoUnit.HOURS);

Теперь я хотел бы проверить, действительно ли два экземпляра Instant относятся к одной и той же дате (день, месяц и год совпадают). Легко, подумал я, давайте просто воспользуемся новым блестящим LocalDate и универсальным from статический метод :

LocalDate localdate1 = LocalDate.from(instant1);
LocalDate localdate2 = LocalDate.from(instant2);

if (localdate1.equals(localdate2)) {
   // All the awesome
}

За исключением того, что универсальный метод from не так уж универсален, и Java жалуется во время выполнения с исключением:

java.time.DateTimeException: Unable to obtain LocalDate from TemporalAccessor: 2014-11-04T18:18:12Z of type java.time.Instant

Что оставляет меня снова на квадрате 1.

Каков рекомендуемый/самый быстрый способ проверить, действительно ли два экземпляра Instant имеют одинаковую дату (имеют один и тот же день, месяц и год)?


person Robin    schedule 15.01.2015    source источник
comment
Другими словами, вам нужно что-то, что работает с Java 7? Как насчет Java 6 или Java 5? Как далеко назад вам нужно, чтобы это работало?   -  person markspace    schedule 15.01.2015
comment
В моем случае это должно работать только для Java 8, вероятно, следовало указать, что   -  person Robin    schedule 15.01.2015
comment
Как насчет использования instant1.truncatedTo(ChronoUnit.DAYS)? Сделайте то же самое на Instant2 и сравните усеченные экземпляры?   -  person dcsohl    schedule 15.01.2015
comment
Просто предположил, но так как вы пытаетесь получить Местнуюдату, а тот Instant, похоже, не имеет никакой информации о местоположении или часовом поясе...   -  person blalasaadri    schedule 15.01.2015
comment
В этом ответе объясняется, как преобразовать Instant в LocalDate. LocalDate.from не работает, потому что Instant не включает часовой пояс.   -  person default locale    schedule 15.01.2015
comment
@defaultlocale: Отлично, это помогает! Теперь остается вопрос, самый ли это быстрый способ (но я его пока возьму) :)   -  person Robin    schedule 15.01.2015


Ответы (1)


Класс Instant не работает с человеческими единицами времени, такими как годы, месяцы или дни. Если вы хотите выполнять вычисления в этих единицах, вы можете преобразовать Instant в другой класс, например LocalDateTime или ZonedDateTime, привязав Instant к часовому поясу. Затем вы можете получить доступ к значению в желаемых единицах.

http://docs.oracle.com/javase/tutorial/datetime/iso/instant.html

Поэтому я предлагаю следующий код:

LocalDate ld1 = LocalDateTime.ofInstant(instant1, ZoneId.systemDefault()).toLocalDate();
LocalDate ld2 = LocalDateTime.ofInstant(instant2, ZoneId.systemDefault()).toLocalDate();

if (ld1.isEqual(ld2)) {
    System.out.println("blubb");
}

В качестве альтернативы вы можете использовать

instant.atOffset(ZoneOffset.UTC).toLocalDate();
person flo    schedule 15.01.2015
comment
если (ld2.getDayOfYear() - ld1.getDayOfYear() == 0) {} - person egemen; 08.06.2018