Timestamp1 - следующий день timestamp2 - PullRequest
1 голос
/ 26 февраля 2020

У меня есть две отметки времени, и я хочу проверить, является ли первая отметка времени следующим днем ​​(завтра) второй отметки времени.

** Следующий день не означает 24 часа, просто следующий DAY_OF_MONTH. например: отметка времени завтрашнего дня 1:00 - это следующий день сегодняшнего 22:00 (хотя это только 3 часа), поэтому ts1 - ts2 <86400 здесь не поможет. </p>

Сначала я думаю извлечь день недели. и сравните дельту, но это нехорошо, потому что следующий день может быть новым месяцем (или новым годом ..)

Единственное решение, которое я могу думать, это:

Calendar cal1 = Calendar.getInstance();
cal1.setTimeInMillis(1582783200000L);

Calendar cal2 = Calendar.getInstance();
cal2.setTimeInMillis(1582727735000L);

cal2.add(Calendar.DAY_OF_YEAR, 1);
cal1.get(Calendar.DAY_OF_MONTH) == cal2.get(Calendar.DAY_OF_MONTH);

Но он ищет мне очень некрасивый код ... Ты знаешь другой способ сделать это?

Ответы [ 2 ]

2 голосов
/ 26 февраля 2020

Используйте java .time, современный Java API даты и времени, как и другой ответ. Моя версия будет:

    ZoneId zone = ZoneId.of("Asia/Tel_Aviv");
    LocalDate d1 = Instant.ofEpochMilli(1_582_783_200_000L).atZone(zone).toLocalDate();
    LocalDate d2 = Instant.ofEpochMilli(1_582_727_735_000L).atZone(zone).toLocalDate();
    if (d2.plusDays(1).equals(d1)) {
        System.out.println("" + d1 + " is the day after " + d2);
    } else {
        System.out.println("" + d1 + " is *not* the day after " + d2);
    }

Вывод:

2020-02-27 - это день после 2020-02-26

As Edwgiz уже сказал, результат зависит от часового пояса, поэтому убедитесь, что вы указали нужный часовой пояс. Я предпочитаю писать числа с таким количеством цифр с подчеркиванием в качестве разделителя тысяч для удобства чтения. A LocalDate - это дата в prolepti c григорианском календаре без времени дня, поэтому сравнение двух таких объектов гарантирует, что мы игнорируем время дня в сравнении.

PS Сравнение дня месяца как в угловых случаях этого недостаточно. Это даст истину при сравнении 27 февраля этого года с 27 ноября прошлого года. Если бы мы хотели использовать Calendar, нам нужно было бы сравнить эру, год, месяц и день месяца. Другими словами, он не предлагает такую ​​хорошую поддержку нашей работы, как java .time.

Ссылка на учебник: Oracle учебник: Дата и время объясняет, как использовать java .time.

2 голосов
/ 26 февраля 2020

Это может быть немного упрощено с новым API даты-времени

        ZoneId zone = ZoneId.systemDefault();
        boolean nextDay = 1 == ChronoUnit.DAYS.between(
                Instant.ofEpochMilli(1582727735000L).atZone(zone).truncatedTo(ChronoUnit.DAYS),
                Instant.ofEpochMilli(1582783200000L).atZone(zone).truncatedTo(ChronoUnit.DAYS));


Обратите внимание, что результат зависит от часового пояса. Таким образом, пример относится к системному стандартному значению, для производственного кода должен применяться явный часовой пояс.

...