тл; д-р
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
Якщо ви знаєте призначений часовий пояс для цього значення, застосуйте a, 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 . І шукайте переповнення стека за багатьма прикладами та поясненнями. Специфікація - 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
, і більш .