java.время
На смену проекту Joda-Time пришла платформа java.time, определенная в JSR 310. Вот современное решение, использующее эти новые классы, найденные в Java 8 и более поздних версиях.
Ваш формат ввода почти соответствует стандарту ISO 8601. В данных просто отсутствует T
между частью даты и частью времени суток, а также отсутствует Z
в конце, чтобы указать UTC. Посмотрите, можете ли вы сообщить издателю ваших данных об этом важном стандарте.
String input = "2019-01-23T01:23:45.123456789Z" ;
Классы java.time по умолчанию используют стандартные форматы. Поэтому нет необходимости указывать шаблон форматирования.
Instant instant = Instant.parse( input ) ;
Instant.toString() = 2019-01-23T01:23:45.123456789Z
Если вы можете изменить формат ввода, определите соответствующий шаблон форматирования.
DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM-ddHH:mm:ss" ) ;
При отсутствии какого-либо индикатора часового пояса или смещения мы должны анализировать как LocalDateTime
. Обратите внимание, что такой объект не представляет момент, не конкретную точку на временной шкале.
String input = "2019-01-2301:23:45" ;
LocalDateTime ldt = LocalDateTime.parse( input , f ) ;
ldt.toString() = 2019-01-23T01:23:45
Вы утверждаете, что эта дата и время должны представлять момент в формате UTC. Таким образом, мы можем применить смещение, используя константу ZoneOffset.UTC
, чтобы получить OffsetDateTime
.
OffsetDateTime odt = ldt.atOffset( ZoneOffset.UTC ) ;
odt.toString() = 2019-01-23T01:23:45Z
Затем вы сказали, что хотите настроить это на определенный часовой пояс. Тот же момент, та же точка на временной шкале, но другое время настенных часов.
Укажите правильное название часового пояса в формате Continent/Region
, например America/Montreal
, Africa/Casablanca
или Pacific/Auckland
. . Никогда не используйте сокращения из 2-4 букв, такие как EST
или IST
, так как они не соответствуют часовым поясам, не стандартизированы и даже не уникальны(!).
ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = odt.atZoneSameInstant( z ) ;
zdt.toString() = 2019-01-23T02:23:45+01:00[Африка/Тунис]
Как видите, Тунис в этот день опережал UTC на час. Таким образом, время дня кажется 2:00, а не 1:00.
27.07.2019
java.util.Date
,java.util.Calendar
иjava.text.SimpleDateFormat
теперь являются устаревшими, вытесненными java.time, встроенные в Java 8 и более поздние версии. См. учебник от Oracle. 27.07.2019