тл; д-р
Перетворення застарілих java.util.Date
об'єктів в їх заміні, java.time.Instant
. Потім обчисліть минулий час як a Duration
.
Duration d =
Duration.between( // Calculate the span of time between two moments as a number of hours, minutes, and seconds.
myJavaUtilDate.toInstant() , // Convert legacy class to modern class by calling new method added to the old class.
Instant.now() // Capture the current moment in UTC. About two and a half hours later in this example.
)
;
d.toString (): PT2H34M56S
d.toMinutes (): 154
d.toMinutesPart (): 34
Формат ISO 8601: PnYnMnDTnHnMnS
Розумний стандарт ISO 8601 визначає стисле текстове представлення проміжку часу як кількості років, місяців, днів, годин тощо. Стандарт називає таку тривалість періоду . Формат - це те, PnYnMnDTnHnMnS
де P
означає «Період», T
відокремлює частину дати від часової частини, а між ними знаходяться числа, за якими йде буква.
Приклади:
P3Y6M4DT12H30M5S
три роки, шість місяців, чотири дні, дванадцять годин, тридцять хвилин і п’ять секунд
PT4H30M
Чотири з половиною години
java.time
Java.time структура , вбудована в Java 8 , а потім витісняє клопітно старі java.util.Date
/ java.util.Calendar
класи. Нові класи натхненні надзвичайно успішною рамкою Joda-Time , призначеною як її наступниця, подібною за концепцією, але переробленою. Визначено JSR 310 . Розширений проектом ThreeTen-Extra . Дивіться Підручник .
Момент
Instant
Клас являє собою момент на часовій шкалі в форматі UTC з дозволом наносекунд (до дев'яти (9) цифр десяткового дробу).
Instant instant = Instant.now() ; // Capture current moment in UTC.
Найкраще уникати спадкових класів, таких як Date
/ Calendar
. Але якщо вам потрібно взаємодіяти зі старим кодом, ще не оновленим до java.time , конвертуйте туди і назад. Викликайте нові методи перетворення, додані до старих класів. Для переміщення з java.util.Date
точки до Instant
, зателефонуйте Date::toInstant
.
Instant instant = myJavaUtilDate.toInstant() ; // Convert from legacy `java.util.Date` class to modern `java.time.Instant` class.
Проміжок часу
Класи java.time розділили цю ідею відображення проміжку часу за кількістю років, місяців, днів, годин, хвилин, секунд на дві половини:
Ось приклад.
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime now = ZonedDateTime.now ( zoneId );
ZonedDateTime future = now.plusMinutes ( 63 );
Duration duration = Duration.between ( now , future );
Скиньте до консолі.
І те, Period
і інше Duration
використовують стандарт ISO 8601 для створення рядкового представлення їх значення.
System.out.println ( "now: " + now + " to future: " + now + " = " + duration );
зараз: 2015-11-26T00: 46: 48.016-05: 00 [Америка / Монреаль] у майбутнє: 2015-11-26T00: 46: 48.016-05: 00 [Америка / Монреаль] = PT1H3M
Java 9 додає способи Duration
отримати частину днів, частину годин, частину хвилин та секунду.
Ви можете отримати загальну кількість днів або годин, хвилин або секунд або мілісекунд або наносекунд протягом усієї тривалості.
long totalHours = duration.toHours();
У Java 9 Duration
клас отримує нові методи повернення різних частин днів, годин, хвилин, секунд, мілісекунд / наносекунд. Назвіть to…Part
методи: toDaysPart()
, toHoursPart()
і так далі.
ChronoUnit
Якщо ви дбаєте лише про більш просту деталізацію часу, наприклад "кількість днів, що минули", використовуйте ChronoUnit
перерахунок.
long daysElapsed = ChronoUnit.DAYS.between( earlier , later );
Ще один приклад.
Instant now = Instant.now();
Instant later = now.plus( Duration.ofHours( 2 ) );
…
long minutesElapsed = ChronoUnit.MINUTES.between( now , later );
120
Про java.time
Java.time каркас вбудований в Java 8 і пізніших версій. Ці класи витісняти неприємні старі застарілі класи дати і часу , такі як java.util.Date
, Calendar
, і SimpleDateFormat
.
Проект Joda-Time , який зараз знаходиться в режимі обслуговування , радить перейти на java.time.
Щоб дізнатися більше, дивіться навчальний посібник Oracle . І шукайте переповнення стека за багатьма прикладами та поясненнями. Специфікація - JSR 310 .
Де отримати класи java.time?
- Java SE 8 та SE 9 та новіші версії
- Вбудований.
- Частина стандартного Java API з пакетною реалізацією.
- Java 9 додає деякі незначні функції та виправлення.
- Java SE 6 і SE 7
- Android
Проект ThreeTen-Extra розширює java.time додатковими класами. Цей проект є передумовою для можливих майбутніх доповнень до java.time. Ви можете знайти деякі корисні класи тут , такі як Interval
, YearWeek
, YearQuarter
, і більш .
Joda-Time
ОНОВЛЕННЯ: Проект Joda-Time зараз знаходиться в режимі обслуговування , команда радить перейти до класів java.time . Цей розділ я залишаю недоторканим для історії.
Бібліотека Joda-Time використовує ISO 8601 для своїх значень за замовчуванням. Його Period
клас аналізує та генерує ці рядки PnYnMnDTnHnMnS.
DateTime now = DateTime.now(); // Caveat: Ignoring the important issue of time zones.
Period period = new Period( now, now.plusHours( 4 ).plusMinutes( 30));
System.out.println( "period: " + period );
Візуалізації:
period: PT4H30M