tl; dr
Duration // Represent a span-of-time in terms of total number of whole seconds plus a fractional second in nanos.
.between( // Calculate elapsed time.
myResultSet.getObject( … , OffsetDateTime.class ) , // Start
myResultSet.getObject( … , OffsetDateTime.class ) , // Stop
) // Returns a `Duration` object.
.toString() // Generate text in standard ISO 8601 format of `PnYnMnDTnHnMnS`.
java.time
Выполнить это на стороне Java просто со столбцом типа данных, похожим на стандарт SQL TIMESTAMP WITH TIME ZONE
и драйверомсоответствует JDBC 4.2 или более поздней версии (для поддержки современных java.time классов).
OffsetDateTime
Получите ваши моменты как OffsetDateTime
объектов, в соответствии с JDBC 4.2 spec .
OffsetDateTime start = myResultSet.getObject( … , OffsetDateTime.class ) ;
OffsetDateTime stop = myResultSet.getObject( … , OffsetDateTime.class ) ;
Duration
Рассчитать прошедшее время как Duration
объект.
Duration d = Duration.between( start , stop ) ;
ISO 8601
Создать стандарт ISO 8601 строка в формате PnYnMnDTnHnMnS
, где P
обозначает начало (вероятно, означает «период» - к сожалению, нет стандартизированных терминов в обработке даты и времени), а T
отделяет годы-месяцы-дни от часов-минут-секунд.Таким образом, полтора часа будет PT1H30M
.Ваш пример 5 days 20hours 6minutes 30 seconds
будет P5DT20H6M30S
.
Классы java.time по умолчанию используют формат ISO 8601.Таким образом, вы генерируете текст, просто вызывая toString
.Не нужно указывать шаблон форматирования.
String output = d.toString() ;
P5DT20H6M30S
Для разбора наберите parse
.
Duration d = Duration.parse( "P5DT20H6M30S" ) ;
Обратите внимание, что Duration
считает дни как 24-часовой период времени без учета календаря.Если вам нужны календарные даты, используйте класс Period
.Если вы хотите объединить оба понятия, используйте класс PeriodDuration
из ThreeTen-Extra , но подумайте дважды, поскольку смешивание двух понятий обычно неразумно и нецелесообразно.
Я настоятельно советую вам не представлять промежуток времени, используя обозначение часов, как показано в вашем Вопросе.Это неоднозначно, чревато ошибками, когда люди неправильно интерпретируют текст, как я лично видел в бизнес-сценариях.Стандартный формат намного мудрее.
Duration::to…Part
Но если вы настаиваете на форматировании часов, создайте строку, вызвав методы to…Part
для Duration
.
String output = d.toDaysPart() + ":" + d.toHoursPart() + ":" + d.toMinutesPart() + ":" + d.toSecondsPart() + "." + d.toNanosPart() ;
toHours
против toHoursPart
Если вы хотите, чтобы все дни указывались как часы, получите общее количество часов за весь промежуток времени, позвонив по номеру toHours
вместо toHoursPart
.Затем получите доли минут и секунд.
Duration d = Duration.between( start , stop ) ;
String output = d.toHours() + ":" + d.toMinutesPart() + ":" + d.toSecondsPart() ;
120: 06: 30
О java.time
Платформа java.time встроена в Java 8 и более поздние версии.Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date
, Calendar
, & SimpleDateFormat
.
Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на классы java.time .
Чтобы узнать больше, см. Oracle Tutorial .И поиск переполнения стека для многих примеров и объяснений.Спецификация: JSR 310 .
Вы можете обмениваться java.time объектами напрямую с вашей базой данных.Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии.Нет необходимости в строках, нет необходимости в java.sql.*
классах.
Где получить классы java.time?
ThreeTen-Extra Проект расширяет java.time дополнительными классами.Этот проект является полигоном для возможных будущих дополнений к java.time.Здесь вы можете найти несколько полезных классов, таких как Interval
, YearWeek
, YearQuarter
и more .