tl;dr
например, если startTime равен 23:00, а endTime 1:00, чтобы получить продолжительность 2:00.
Невозможно. Если у вас только время суток, часы останавливаются в полночь. Без контекста дат, как мы узнаем, имеете ли вы в виду 1 час ночи следующего дня, на следующей неделе или в следующем десятилетии?
Таким образом, переход с 23:00 до 1:00 означает движение назад во времени на 22 часа, вращая стрелки часов против часовой стрелки. См. Результат ниже, отрицательный через двадцать два часа.
Duration.between( // Represent a span of time a total number of seconds plus a fractional second in nanoseconds.
LocalTime.of( 23 , 0 ) , // A time-of-day without a date and without a time zone.
LocalTime.of( 1 , 0 ) // A time-of-day clock stops at midnight. So getting to 1 AM from 11 PM means going backwards 22 hours.
) // Return a `Duration` object.
.toString() // Generate a `String` representing this span of time using standard ISO 8601 format: PnYnMnDTnHnMnS
PT-22H
Пересечение полуночи требует более широкого контекста даты в дополнение к времени суток (см. Ниже).
Как в Java измерить прошедшее время?
- Захватите текущий момент в формате UTC с помощью
Instant.now()
.
- Запечатлейте еще один такой момент позже.
- Передайте оба значения в _ 3_.
- (a) Из полученного объекта
Duration
извлеките количество 24-часовых дней, часов, минут, секунд и долей секунды в наносекундах, вызвав различные методы to…Part
.
(b) Или вызовите toString
, чтобы сгенерировать String
в стандартном формате ISO 8601 из PnYnMnDTnHnMnS
.
Пример кода с использованием пары объектов Instant
.
Duration.between( // Represent a span of time a total number of seconds plus a fractional second in nanoseconds.
then , // Some other `Instant` object, captured earlier with `Instant.now()`.
Instant.now() // Capture the current moment in UTC with a resolution as fine as nanoseconds, depending on the limits of your host computer hardware clock and operating system. Generally you will get current moment in microseconds (six decimal digits of fractional second) in Java 9, 10, and 11, but only milliseconds in Java 8.
) // Return a `Duration` object.
.toString() // Generate a `String` representing this span of time using standard ISO 8601 format: PnYnMnDTnHnMnS
PT3M27.602197S
Новые технологии в Java 8+
У нас есть новая технология, встроенная в Java 8 и более поздних версий, java.time framework.
java.time
Фреймворк java.time определяется JSR 310, вдохновленным очень успешным < проект href = "http://www.joda.org/joda-time/" rel = "noreferrer"> Joda-Time, расширенный ThreeTen-Extra, описанный в Oracle Tutorial.
Старые классы даты и времени, такие как java.util.Date/.Calendar, связанные с самыми ранними версиями Java, оказались плохо спроектированными, запутанными и неудобными. Их вытесняют классы java.time.
разрешение
В других ответах обсуждается разрешение.
Классы java.time имеют наносекунду разрешение до девяти цифр десятичной доли секунды. Например, 2016-03-12T04:29:39.123456789Z
.
И старые классы java.util.Date/.Calendar, и классы Joda-Time имеют разрешение в миллисекундах (3 цифры дроби). Например, 2016-03-12T04:29:39.123Z
.
В Java 8 текущий момент выбирается с разрешением до миллисекунды из-за устаревшей проблемы. В Java 9 и более поздних версиях текущее время может быть определено с точностью до наносекунды, если аппаратные часы вашего компьютера работают так точно.
Время суток
Если вы действительно хотите работать только с временем суток, без даты или часового пояса, используйте _ 13_ класс.
LocalTime sooner = LocalTime.of ( 17, 00 );
LocalTime later = LocalTime.of ( 19, 00 );
Duration
представляет собой промежуток времени, отсчета секунд плюс наносекунды.
Duration duration = Duration.between ( sooner, later );
Выгрузить в консоль.
System.out.println ( "sooner: " + sooner + " | later: " + later + " | duration: " + duration );
раньше: 17:00 | позже: 19:00 | продолжительность: PT2H
ISO 8601
Обратите внимание, что по умолчанию Duration::toString
выводится в стандартном формате ISO 8601. В этом формате P
обозначает начало (как в «Периоде»), а T
отделяет любую часть «годы-месяцы-дни» от части «часы-минуты-секунды».
Пересечение полуночи
К сожалению, работать со временем суток становится сложно, только когда вы переводите круглосуточно, пересекая полночь. Класс LocalTime
обрабатывает это, предполагая, что вы хотите вернуться к более раннему моменту дня.
Использование того же кода, что и выше, но переход от 23:00
к 01:00
дает отрицательные двадцать два часа (PT-22H
).
LocalTime sooner = LocalTime.of ( 23, 0 );
LocalTime later = LocalTime.of ( 1, 0 );
раньше: 23:00 | позже: 01:00 | продолжительность: ПТ-22Н
Дата-время
Если вы намереваетесь пересечь полночь, вам, вероятно, имеет смысл работать со значениями даты и времени, а не только со значениями времени суток.
Часовой пояс
Часовой пояс имеет решающее значение для дат. Итак, мы указываем три элемента: (1) желаемую дату, (2) желаемое время дня и (3) часовой пояс как контекст, с помощью которого можно интерпретировать эту дату и время. Здесь мы произвольно выбираем часовой пояс Монреаль.
Если вы определяете дату только с помощью смещения от UTC, используйте _ 26_ с _ 27_. Если у вас есть полный часовой пояс (смещение плюс правила обработки аномалий, таких как переход на летнее время), используйте _ 28_ с _ 29_.
LocalDate localDate = LocalDate.of ( 2016, 1, 23 );
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime sooner = ZonedDateTime.of ( localDate, LocalTime.of ( 23, 0 ), zoneId );
Мы указываем более позднее время как следующий день в 1:00 утра.
ZonedDateTime later = ZonedDateTime.of ( localDate.plusDays ( 1 ), LocalTime.of ( 1, 0 ), zoneId );
Мы вычисляем Duration
таким же образом, как показано выше. Теперь мы получаем два часа, ожидаемые этим Вопросом.
Duration duration = Duration.between ( sooner, later );
Выгрузить в консоль.
System.out.println ( "sooner: " + sooner + " | later: " + later + " | duration: " + duration );
раньше: 2016-01-23T23: 00-05: 00 [Америка / Монреаль] | позже: 2016-01-24T01: 00-05: 00 [Америка / Монреаль] | продолжительность: PT2H
Летнее время
Если бы в имеющейся дате использовалось летнее время (DST) или другая подобная аномалия, классы java.time корректировались бы по мере необходимости. Подробности читайте в документации по классу.
О java.time
java.time framework встроена в Java 8 и новее. Эти классы заменяют неудобные старые устаревшие классы даты и времени, такие как _ 35_, _ 36_, & _ 37_.
Проект Joda-Time теперь в режим обслуживания, советует перейти на java.time классы.
Чтобы узнать больше, см. Учебник Oracle . И поищите в Stack Overflow множество примеров и объяснений. Спецификация - JSR 310.
Вы можете обмениваться объектами java.time непосредственно с вашей базой данных. Используйте драйвер JDBC, совместимый с JDBC 4.2 или новее. Нет необходимости в строках, нет необходимости в java.sql.*
классах.
Где взять классы java.time?
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является испытательной площадкой для возможных будущих дополнений к java.time. Здесь вы можете найти несколько полезных классов, например _39 _, YearWeek
, _ 41_ и подробнее.
person
Basil Bourque
schedule
16.03.2016
System.nanoTime()
. Этот вопрос здесь сосредоточен на вычислении прошедшего времени между двумя моментами без учета получения текущего времени. - person Basil Bourque   schedule 17.03.2016