Укажите часовой пояс явно
При вызове now
вы всегда должны явно указывать желаемый / ожидаемый часовой пояс. В любой момент времени дата меняется по всему земному шару в зависимости от часового пояса. Это может быть «завтра» в Токио, Япония, а «вчера» в Касабланке, Марокко. Когда вы опускаете зону, текущая зона по умолчанию JVM неявно применяется во время выполнения - поэтому ваши результаты могут отличаться.
ZoneId z = ZoneId.of( "Africa/Casablanca" ) ; // Or `ZoneId.systemDefault` if you actually want the JVM’s current default time zone.
LocalDate ld = LocalDate.now( z ) ; // Capture the current date as seen in the wall-clock time used by the people of a particular region (a time zone).
LocalDate
LocalDate
класс представляет только дату, без времени суток и без часового пояса или смещения от UTC.
Если вы хотите объединить время суток с датой, используйте один из других классов.
Дата-время математика
Классы java.time предлагают plus…
и minus…
методы для добавления или вычитания промежутка времени.
LocalDate yesterday = ld.minusDays( 1 ) ;
Первый момент дня
Видимо, вы хотите первый момент свидания. Несколько вещей, чтобы понять здесь. Во-первых, нужен часовой пояс. Как уже говорилось выше, в разные моменты по всему земному шару наступает новый день. Во-вторых, не думайте, что день начинается в 00:00:00. Аномалии, такие как переход на летнее время (DST), означают, что день в некоторые даты в тех же зонах может начаться в другое время, например, 01:00:00. Пусть java.time определит первый момент.
ZonedDateTime zdt = ld.atStartOfDay( z ) ; // Let java.time determine the first moment of the day.
Half-Open
Очевидно, вы хотите, чтобы конец дня. Отслеживание последнего момента дня проблематично. Например, ваш текст 23:59
пропустит любой момент этой последней минуты дня.
Как правило, лучшим подходом к отслеживанию промежутков времени является подход Half-Open, где начало включительно , а окончание эксклюзив . Таким образом, день начинается с первого момента дня и продолжается, но не включает первый момент следующего дня.
ZonedDateTime start = ld.atStartOfDay( z ) ; // Start of today.
ZonedDateTime stop = ld.plusDays( 1 ).atStartOfDay( z ) ; // Start of tomorrow.
DateTimeFormatter
Чтобы сгенерировать строки, представляющие значение объекта даты и времени, используйте объект DateTimeFormatter
. Я не буду описывать это здесь, так как это было уже много-много раз уже в переполнении стека.
DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM-dd HH:mm" ) ;
String output = zdt.format( f ) ; // Generate text representing the value of this `ZonedDateTime` object.
Имейте в виду, что объекты даты и времени не имеют «формата», формат имеет только текстовое представление значения объекта даты и времени. Не связывайте строковый объект с объектом даты и времени. Объект даты и времени может анализировать строку и может генерировать строку, но сам по себе не является строкой.