Разница между датой и временем в Java
У меня есть переменная времени startDate
:
startDate = 2018-01-01 00:00:40.554
И я хочу рассчитать endDay
что 24 часа от startDate
, а также endHour
что в 60 минутах от startDate
,
dayDiff = Days.daysBetween(startDate.toLocalDate(), 24hours.toLocalDate()).getDays()
Итак, в основном:
startDate + 1day = endDay
startDate + 60mins = endHour
2 ответа
ТЛ; др
java.time.LocalDateTime.parse(
"2018-01-01 00:00:40.554".replace( " " , "T" )
).plusMinutes( 60 )
2018-01-01T01:00:40,554
java.time
Проект Joda-Time сейчас находится в режиме обслуживания, и команда советует перейти на классы java.time.
ISO 8601
Ваш ввод почти в стандартном формате ISO 8601, используемом по умолчанию в классах java.time. Чтобы соответствовать, замените ПРОБЕЛ в середине T
,
String input = "2018-01-01 00:00:40.554".replace( " " , "T" ) ;
LocalDateTime
В вашем строковом вводе отсутствует индикатор часового пояса или смещения от UTC. Так разбирай как java.time.LocalDateTime
,
LocalDateTime ldt = LocalDateTime.parse( input ) ;
ldt.toString(): 2018-01-01T00:00:40.554
Часовой пояс
Обратите внимание, что у вас нет фактического момента, это не конкретная точка на временной шкале. Это только смутное представление о потенциальных моментах в диапазоне около 26-27 часов. Чтобы определить фактический момент, поместите его в контекст часового пояса (или смещения): ZonedDateTime zdt = ldt.atZone( ZoneId.of( "Pacific/Auckland" ) ) ;
,
Дата-время математика
Вы можете представить свои промежутки времени, не привязанные к временной шкале, как Period
на годы-месяцы-дни или Duration
на часы-минуты-секунды.
Duration d24Hours = Duration.ofHours( 24 ) ;
d24Hours.toString (): PT24H
Duration d60Minutes = Duration.ofMinutes( 60 ) ;
d60Minutes.toString (): PT1H
Позвоните plus
метод, чтобы добавить эти промежутки времени.
LocalDateTime ldtLater = ldt.plus( d60Minutes ) ;
ldtLater.toString (): 2018-01-01T01:00:40.554
LocalDateTime ldtMuchLater = ldt.plus( d24Hours ) ;
ldtMuchLater.toString (): 2018-01-02T00: 00: 40.554
О 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?
- Java SE 8, Java SE 9 и более поздние
- Встроенный.
- Часть стандартного Java API со встроенной реализацией.
- Java 9 добавляет некоторые незначительные функции и исправления.
- Java SE 6 и Java SE 7
- Большая часть функциональности java.time перенесена на Java 6 и 7 в ThreeTen-Backport.
- Android
- Более поздние версии Android связывают реализации классов java.time.
- Для более ранних версий Android (<26) проект ThreeTenABP адаптирует ThreeTen-Backport (упомянутый выше). Смотрите Как использовать ThreeTenABP….
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Вы можете найти некоторые полезные классы здесь, такие как Interval
, YearWeek
, YearQuarter
и многое другое.
Я предполагаю, что вы используете Joda-Time, потому что вы использовали Days.daysBetween
и я не знаю другого API с таким классом и методом.
Тем не мение, Days.daysBetween
вычисляет разницу между 2 датами / временем (число, представляющее, сколько дней между этими датами), но что вам действительно нужно, так это добавить продолжительность (1 день или 1 час) к дате.
При условии, что startDate
это DateTime
, ты можешь сделать:
DateTime endDay = startDate.plusHours(24);
DateTime endHour = startDate.plusMinutes(60);
Если тип startDate
другой (например, LocalDateTime
), не волнуйтесь, все эти базовые классы также имеют похожие методы.
я звонил plusHours(24)
, но я мог бы также использовать plusDays(1)
, Напомним, что, как отмечалось в комментариях, добавление 1 дня не всегда совпадает с добавлением 24 часов, что связано с проблемами перехода на летнее время (подробнее о проблемах перехода на летнее время можно узнать здесь).