tl; dr
Используйте современные java.time классы.
LocalDateTime
.parse(
"31-12-2018 23:37:00" ,
DateTimeFormatter.ofPattern( "dd-MM-uuuu HH:mm:ss" )
)
.atOffset(
ZoneOffset.UTC
)
.toString()
2018-12-31T23: 37Z
java.time
Используйте современные java.time классы, а не такие ужасные унаследованные классы, как Date
.
Анализируйте вашу входную строку как LocalDateTime
, поскольку в нем отсутствует индикатор часового пояса или смещения от UTC, и, следовательно, не представляет момент.
DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd-MM-uuuu HH:mm:ss" ) ;
LocalDateTime ldt = LocalDateTime.parse( "31-12-2018 23:37:00" , f ) ;
Вы утверждаете, что знаете часовой пояс, который был задумандля этой входной строки.Если вы уверены, примените ZoneId
, чтобы получить ZonedDateTime
, чтобы определить фактический момент, точку на временной шкале.
Укажите правильное имя часового пояса в форматеcontinent/region
, например America/Montreal
, Africa/Casablanca
или Pacific/Auckland
.Никогда не используйте 2-4 буквенные сокращения, такие как EST
или IST
, так как они не истинные часовые пояса, не стандартизированы и даже не уникальны (!).
ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = ldt.atZone( z ) ;
Ваш вопрос неясен.Но, возможно, вы говорите, что ввод был предназначен для представления момента в UTC.Если это так, примените константу ZoneOffset.UTC
, чтобы получить объект OffsetDateTime
.
OffsetDateTime odt = ldt.atOffset( ZoneOffset.UTC ) ;
Желаемый результат: 2018-12-31T23: 37: 00.808Z
Это невозможно, так как вашей входной строке не хватало доли секунды .808
.
Окончание, которое вы указали как проблему, .000Z
будет правильным, поскольку нули означают, что доли секунды нет.Z
в конце означает UTC (смещение от UTC, равное нулю), сокращение от +00:00
и произносится Zulu
.
О 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?
ThreeTen-Extra Проект расширяет java.time дополнительными классами.Этот проект является полигоном для возможных будущих дополнений к java.time.Здесь вы можете найти несколько полезных классов, таких как Interval
, YearWeek
, YearQuarter
и больше .