Как я могу получить временную метку на сегодня 9 утра или завтра 9 утра, в зависимости от того, будем ли мы 9 утра? - PullRequest
0 голосов
/ 17 марта 2020

У меня есть бэкэнд с весенней загрузкой, и я хочу публиковать sh новости в 9:00 UTC + 1 каждый день.

Я хотел бы получить java.time.Instant для:

  • сегодня 9:00 UTC + 1
  • завтра 9:00 UTC + 1

В зависимости от того, можем ли мы сделать это надежно для всех моих клиентов в 9:00?

Ответы [ 2 ]

2 голосов
/ 17 марта 2020

Вы можете использовать OffsetDateTime следующим образом:

LocalTime targetTime = LocalTime.of(9, 0);

OffsetDateTime dateTime = OffsetDateTime.now(ZoneOffset.ofHours(1));
if (dateTime.toLocalTime().compareTo(targetTime) >= 0)
    dateTime = dateTime.plusDays(1);
Instant instant = dateTime.with(targetTime).toInstant();

System.out.println(instant);

Вывод (выполнено в 2020-03-17T14: 47 + 01: 00)

2020-03-18T08:00:00Z

Измените >= на >, если ровно 9 часов утра должны остаться такими же, как сегодня.

0 голосов
/ 17 марта 2020

После выяснения некоторых недоразумений, ответ был скорректирован, чтобы использовать часовой пояс по умолчанию клиента и вернуть Instant.

Это означает, что вы можете использовать ZonedDateTime с системной зоной для этого , посмотрите на следующий метод и его комментарии:

public static Instant determineNextNewsRelease() {
    // get the current time using the default time zone of the client
    ZonedDateTime now = ZonedDateTime.now(ZoneId.systemDefault());
    // get 9 AM using the same day/date
    ZonedDateTime nineAM = now.with(LocalTime.of(9, 0));

    // and check if now is before nineAM
    if (now.isBefore(nineAM)) {
        return nineAM.toInstant();
    } else {
        return nineAM.plusDays(1).toInstant();
    }
}

Используйте метод, подобный этому:

public static void main(String[] args) {
    Instant nextNewsRelease = determineNextNewsRelease();
    // and print the result
    System.out.println("Next news will be released at "
            + nextNewsRelease.toEpochMilli() + " (" 
            + ZonedDateTime.ofInstant(nextNewsRelease, ZoneId.systemDefault())
            + ")");
}

Выведен результат

Next news will be released at 1584518400000 (2020-03-18T09:00+01:00[Europe/Berlin])

Попробуйте это ...

...