ТЛ; др
LocalDateTime.parse(
"2016-01-23 12:34".replace( " " , "T" )
)
.atZone( ZoneId.of( "Asia/Karachi" ) )
.plusMinutes( 10 )
java.time
Используйте отличные классы java.time для работы с датой и временем. Эти классы вытесняют неприятные старые классы даты и времени, такие как java.util.Date
и java.util.Calendar
.
ISO 8601
Классы java.time по умолчанию используют стандартные форматы ISO 8601 для анализа / генерации строк значений даты и времени. Чтобы ваша входная строка соответствовала, замените ПРОБЕЛ в середине на T
.
String input = "2016-01-23 12:34" ;
String inputModified = input.replace( " " , "T" );
LocalDateTime
Разберите вашу входную строку как LocalDateTime
, так как в ней отсутствует какая-либо информация о часовом поясе или смещении от UTC.
LocalDateTime ldt = LocalDateTime.parse( inputModified );
Добавьте десять минут.
LocalDateTime ldtLater = ldt.plusMinutes( 10 );
ldt.toString (): 2016-01-23T12: 34
ldtLater.toString (): 2016-01-23T12: 44
См. живой код в IdeOne.com .
У LocalDateTime
нет часового пояса, поэтому не представляет точку на временной шкале. Применить часовой пояс, чтобы перевести на фактический момент. Укажите правильное имя часового пояса в формате continent/region
, например America/Montreal
, Africa/Casablanca
, Pacific/Auckland
или Asia/Karachi
. Никогда не используйте 3-4-буквенное сокращение, например EST
или IST
или PKT
, так как они не истинных часовых поясов, не стандартизированы и даже не уникальны (!).
ZonedDateTime
Если вы знаете предполагаемый часовой пояс для этого значения, примените ZoneId
, чтобы получить ZonedDateTime
.
ZoneId z = ZoneId.of( "Asia/Karachi" );
ZonedDateTime zdt = ldt.atZone( z );
zdt.toString (): 2016-01-23T12: 44 + 05: 00 [Азия / Карачи]
Аномалии
Подумайте, нужно ли добавить эти десять минут до или после добавления часового пояса. Вы можете получить совсем другой результат из-за таких аномалий, как летнее время (DST), которые сдвигают время настенных часов .
Нужно ли добавлять 10 минут до или после добавления зоны, зависит от значения вашего бизнес-сценария и правил.
Совет. Когда вы указываете определенный момент на временной шкале, всегда сохраняет информацию о часовом поясе . Не теряйте эту информацию, как это делается с вашими входными данными. Значение 12:34
означает полдень в Пакистане или полдень во Франции или полдень в Квебеке? Если вы имели в виду полдень в Пакистане, скажите это, указав хотя бы смещение от UTC (+05:00
) и, что еще лучше, название часового пояса (Asia/Karachi
).
Instant
Если вам нужен тот же момент, который виден через объектив UTC , извлеките Instant
. Класс Instant
представляет момент на временной шкале в UTC с разрешением наносекунд (до девяти (9) цифр десятичной дроби).
Instant instant = zdt.toInstant();
Преобразование
По возможности избегайте хлопотных старых классов даты и времени. Но если вам нужно, вы можете обратить. Вызовите новые методы, добавленные к старым классам.
java.util.Date utilDate = java.util.Date.from( instant );
О 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 .