tl; dr
Используйте современные java.time классы, никогда Date
.Преобразуйте любые Date
в java.time.Instant
.
Duration // Represent a span-of-time as 24-hour days, hours, minutes, seconds, and nanoseconds.
.between( // Calculate elapsed time.
javaUtilDateStart.toInstant() , // Convert any `java.util.Date` to `java.time.Instant`. Never use `Date`; it is a terrible class, ditto for `Calendar`.
javaUtilDateStop.toInstant()
) // Returns a `Duration` object.
.toString() // Generate text in standard ISO 8601 format.
Или вызовите методы to…Part
, чтобы извлечь количество дней, часов и т. Д.
java.time
Вы используете ужасные старые классы даты и времени (Date
, Calendar
, SimpleDateFormat
), которые были вытеснены несколько лет назад классами java.time .
Instant
Очевидно, вам вручают java.util.Date
объект.Если возможно, перепишите этот код, чтобы использовать его замену, объект java.time.Instant
.Оба представляют момент в UTC, но Instant
имеет лучшее разрешение наносекунд, нежели миллисекунд.Если это невозможно, немедленно конвертируйте Date
в Instant
.Вызовите новые методы преобразования, добавленные к старым классам.
Instant instant = myJavaUtilDate.toInstant() ; // Convert from legacy class to modern class. Same moment in UTC, same point on the timeline.
Создание текста, представляющего этот момент в стандартном формате ISO 8601 .
Захват текущего момента в формате UTC.
Instant now = Instant.now() ; // Capture the current moment in UTC.
Duration
Рассчитать прошедшее время как объект Duration
.Опять же, это имеет разрешение наносекунд.
Duration d = Duration.between( instant , now ) ;
Создание текста, представляющего прошедшее время, в стандартном формате ISO 8601 .
String output = d.toString() ;
Или создайте строку,определяя «дни» как 24-часовой отрезок времени без учета календаря.
long days = d.toDaysPart() ;
int hours = d.toHoursPart() ;
int minutes = d.toMinutesPart() ;
int seconds = d.toSecondsPart() ;
String output = days + "." + hours + "." + minutes + "." + seconds ;
Синтаксический анализ строк
Ваш вопрос не ясен относительно ваших входных данных.Если начать со строк, проанализируйте.Во-первых, если возможно, измените источник этих строк, чтобы использовать мудро определенные стандартные форматы ISO 8601 .Если это невозможно, определите шаблон форматирования в соответствии с вводом.
String inputStart = "02-10-2018 10.30";
DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd-MM-uuuu HH.mm" );
Анализируйте ввод как LocalDateTime
, так как в нем отсутствует какой-либо индикатор часового пояса или смещения отUTC.
LocalDateTime ldtStart = LocalDateTime.parse( inputStart , f ) ;
A LocalDateTime
- это не момент, не представляет точку на временной шкале.Этот класс представляет потенциальных моментов в диапазоне около 26-27 часов, диапазоне часовых поясов по всему земному шару.
Назначьте зону или смещение, предназначенные источником этой строки, длядать контекст, необходимый для определения момента.
Укажите правильное имя часового пояса в формате continent/region
, например America/Montreal
, Africa/Casablanca
или Pacific/Auckland
.Никогда не используйте 2-4 буквенные сокращения, такие как EST
или IST
, так как они не истинные часовые пояса, не стандартизированы и даже не уникальны (!).
// Transform the indefinite `LocalDateTime` to a definite moment by assigning the time zone intended by that input string.
ZoneId z = ZoneId.of( "Africa/Tunis" );
ZonedDateTime zdtStart = ldtStart.atZone( z );
Рассчитайте ваш промежуток времени.
Duration d = Duration.between( zdtStart , zdtStop ) ;
О java.time
java.time Framework встроен в 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 .