TL; DR
ZonedDateTime yesterday = ZonedDateTime.now(ZoneId.of("Europe/Madrid"))
.minusDays(1)
.truncatedTo(ChronoUnit.HOURS);
System.out.println("Yesterday with minutes and seconds set to 0: " + yesterday);
Бег только что дал
Вчера с минутами и секундами, установленными в 0: 2019-03-17T23: 00 + 01: 00 [Европа / Мадрид]
Определить вчера
Если вы намеревались «вчера в одно и то же время», это не всегда 24 часа назад. Из-за летнего времени (DST) и других аномалий день может составлять, например, 23, 23,5 или 25 часов.
java.time
Класс ZonedDateTime
java.time, современного Java-API даты и времени, учитывает аномалии времени в вашем часовом поясе. Поэтому, когда вы вычитаете день, вы получаете то же самое время вчера, если это время вообще существует.
.truncatedTo(ChronoUnit.HOURS)
устанавливает минуты, секунды и доли секунды в 0 часовом поясе.
Вы пытались использовать класс Date
, но в Java 8 вы не должны этого делать. Он плохо спроектирован и давно устарел. Я считаю, что с java.time гораздо приятнее работать.
Если вам обязательно нужна старомодная дата
Вам может понадобиться Date
для устаревшего API, который вы не можете изменить или не можете позволить себе изменить прямо сейчас. В этом случае конвертируйте только в последний момент:
Instant yesterdayInstant = yesterday.toInstant();
Date yesterdayDate = Date.from(yesterdayInstant);
System.out.println("As old-fashoined Date: " + yesterdayDate);
В моем часовом поясе (Европа / Копенгаген, в настоящее время согласен с Европой / Мадридом) я получил
Как в старом возрасте Дата: вс 17 марта 23:00:00 CET 2019
Ссылка
Учебное пособие по Oracle: Дата и время , объясняющее, как использовать java.time.