tl; dr
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
Разберите входную строку как a, 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
означает: полдень в Пакистане, полдень во Франции или полдень в Квебеке? Если вы имели в виду полдень в Пакистане, скажите об этом, включив хотя бы offset-from-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 . И поищите в Stack Overflow множество примеров и объяснений. Спецификация - JSR 310 .
Где взять классы java.time?
- Java SE 8 и SE 9 и новее
- Встроенный.
- Часть стандартного Java API со встроенной реализацией.
- В Java 9 добавлены некоторые незначительные функции и исправления.
- Java SE 6 и SE 7
- Большая часть функциональности java.time перенесена на Java 6 и 7 в ThreeTen-Backport .
- Android
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является испытательной площадкой для возможных будущих дополнений к java.time. Вы можете найти некоторые полезные классы здесь , такие как Interval
, YearWeek
, YearQuarter
, и более .