ТЛ; др
Instant then = // Represent a moment in UTC.
ZonedDateTime // Represent a moment as seen through the wall-clock time used by the people of a particular region (a time zone).
.now( // Capture the current moment. Holds up to nanosecond resolution, but current hardware computer clocks limited to microseconds for telling current time.
ZoneId.of( "Africa/Casablanca" ) // Specify the time zone. Never use 2-4 letter pseudo-zones such as `IST`, `PST`, `EST`.
) // Returns a `ZonedDateTime` object.
.toLocalDate() // Extract the date-only portion, without time-of-day and without time zone.
.atStartOfDay( // Deterimine the first moment of the day on that date in that time zone. Beware: The day does *not* always begin at 00:00:00.
ZoneId.of( "Africa/Casablanca" ) // Specify the time zone for which we want the first moment of the day on that date.
) // Returns a `ZonedDateTime` object.
.toInstant() // Adjusts from that time zone to UTC. Same moment, same point on the timeline, different wall-clock time.
;
...
Duration // Represent a span-of-time unattached to the timeline in terms of hours-minutes-seconds.
.between( // Specify start and stop moments.
then , // Calculated in code seen above.
Instant.now() // Capture current moment in UTC.
) // Returns a `Duration` object.
.getSeconds() // Extract the total number of whole seconds accross this entire span-of-time.
java.time
В Java 8 и более поздних версиях встроен фреймворк java.time.
Используя ZonedDateTime
и часовой пояс, мы обрабатываем такие аномалии, как Летнее время (DST) . Например, в Соединенных Штатах день может длиться 23, 24 или 25 часов . Так что время до завтра может варьироваться на ± 1 час от одного дня к другому.
Сначала получите текущий момент.
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime now = ZonedDateTime.now( z );
Теперь извлеките часть только для даты, LocalDate
, и используйте эту дату, чтобы спросить java.time, когда этот день начался для нашего желаемого часового пояса. Не думайте, что день начался в 00:00:00. Аномалии, такие как переход на летнее время (DST), означают, что день может начаться в другое время, например 01:00:00.
ZonedDateTime todayStart = now.toLocalDate().atStartOfDay( z ); // Crucial to specify our desired time zone!
Теперь мы можем получить дельту между текущим моментом и началом сегодняшнего дня. Такой промежуток времени, не связанный с временной шкалой, представлен классом Duration
.
Duration duration = Duration.between( todayStart , now );
Запросите у объекта Duration
общее количество секунд за весь промежуток времени.
long secondsSoFarToday = duration.getSeconds();
О java.time
Фреймворк java.time встроен в Java 8 и более поздние версии. Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date
, Calendar
, & SimpleDateFormat
.
Проект Joda-Time , находящийся сейчас в режиме обслуживания , рекомендует перейти на классы java.time .
Чтобы узнать больше, см. Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .
Где получить классы java.time?
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти некоторые полезные классы, такие как Interval
, YearWeek
, YearQuarter
и more .