ТЛ; др
Duration.between(
ZonedDateTime.of(
LocalDate.parse( "26/02/2011" , DateTimeFormatter.ofPattern( "dd/MM/uuuu" ) ) ,
LocalTime.parse( "11:00 AM" , DateTimeFormatter.ofPattern( "hh:mm a" ) ) ,
ZoneId.of( "America/Montreal" )
)
,
ZonedDateTime.of(
LocalDate.parse( "27/02/2011" , DateTimeFormatter.ofPattern( "dd/MM/uuuu" ) ) ,
LocalTime.parse( "12:15 AM" , DateTimeFormatter.ofPattern( "hh:mm a" ) ) ,
ZoneId.of( "America/Montreal" )
)
).toString()
См. живой код в IdeOne.com .
Часовой пояс
Вопрос и другие ответы игнорируют критическую проблему часового пояса. Вы не можете рассчитать прошедшее время между двумя строками даты и времени, не зная предполагаемого часового пояса. Например, в местах с переходом на летнее время (DST) в ночь перерыва день может длиться 23 часа или 25 часов, а не 24 часа.
java.time
Современный способ работы с датой и временем - с помощью классов java.time. Они вытесняют неприятные старые классы даты и времени, такие как java.util.Date
и java.util.Calendar
.
Local…
Сначала проанализируйте входные строки. В них отсутствует указание часового пояса, поэтому мы анализируем их как Local…
типов.
Определите DateTimeFormatter
, чтобы соответствовать вашим строковым входам. Кстати, в будущем используйте стандартные форматы ISO 8601 при сериализации значений даты и времени в текст.
DateTimeFormatter df = DateTimeFormatter.ofPattern( "dd/MM/uuuu" );
LocalDate ld = LocalDate.parse( "26/02/2011" , df ) ;
ld.toString (): 2011-02-2011
DateTimeFormatter tf = DateTimeFormatter.ofPattern( "hh:mm a" );
LocalTime lt = LocalTime.parse( "11:00 AM" , tf ) ;
lt.toString (): 11: 00: 00
ZoneId
Вам необходимо знать часовой пояс, предусмотренный вашим бизнес-сценарием. Я произвольно выберу один.
Укажите собственное имя часового пояса в формате continent/region
, например America/Montreal
, Africa/Casablanca
или Pacific/Auckland
. Никогда не используйте 3-4-буквенное сокращение, например EST
или IST
, поскольку они не истинные часовые пояса, не стандартизированы и даже не уникальны (!).
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime
Примените зону, чтобы получить ZonedDateTime
.
ZonedDateTime zdtStart = ZonedDateTime.of( ld , lt , z );
zdtStart.toString (): 2011-02-26T11: 00: 00-05: 00 [Америка / Монреаль]
Duration
Сделайте то же самое, чтобы получить zdtStop
. Рассчитайте прошедшее время как промежуток времени, не привязанный к временной шкале, в виде Duration
.
Duration d = Duration.between( zdtStart , zdtStop );
Позвоните toString
, чтобы сгенерировать строку в стандартном формате ISO 8601 для длительностей : PnYnMnDTnHnMnS
. P
отмечает начало, а T
разделяет две части.
String output = d.toString();
d.toString (): PT13H15M
В Java 9 и более поздних версиях вызывайте методы to…Part
для доступа к каждому компоненту.
О java.time
Инфраструктура java.time встроена в Java 8 и более поздние версии. Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date
, Calendar
и & SimpleDateFormat
.
Проект Joda-Time , теперь в режиме обслуживания , рекомендует выполнить переход на java.time классы.
Чтобы узнать больше, см. Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация 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
и more .