tl; dr
myJavaUtilDate // The terrible `java.util.Date` class is the legacy way to represent a moment in UTC.
.toInstant() // `Instant` is modern way to represent a moment in UTC.
.atZone( // Adjust from UTC to some time zone.
ZoneId.of( "America/Martinique" ) // Specify the time zone you had in mind for an offset of four hours behind UTC.
) // Returns a `ZonedDateTime` object.
.format( // Generate text representing the value of our `ZonedDateTime` object's content.
DateTimeFormatter.ISO_LOCAL_DATE_TIME // A predefined formatter per ISO 8601 that omits any indication of time zone or offset-from-UTC.
)
.replace(
"T" , // Standard ISO 8601 formats use a `T` between the date and time-of-day portions.
" "
) // Returns a `String`.
java.util.Date::toInstant
requestVO.getStartDate () дает значение типа Date.
Вы работаете слишком сложно.
Преобразуйте ужасный объект класса Date
в его современную замену Instant
. Обратите внимание, как унаследованные классы получили новые методы для преобразования в / из современных java .time . Ищите to…
& from…
методы на старых классах. В этом случае Date::toInstant
.
Instant instant = myJavaUtilDate.toInstant() ;
Зона и смещение
.atZone (ZoneId.of ("GMT-4"))
Нет, -4
- это не часовой пояс. Это смещение.
Смещение от UT C всего на несколько часов-минут-секунд вперед или позади основного меридиана.
Часовой пояс намного больше. Часовой пояс - это история прошлых, настоящих и будущих изменений смещения, используемых людьми определенного региона. Часовой пояс носит имя в формате Continent/Region
, например Asia/Kolkata
или Pacific/Auckland
.
Лучше использовать часовой пояс, чем простое смещение. Во-первых, вы можете ошибаться в смещении. Используя часовой пояс, java .time будет определять смещение, действующее в нужный момент.
Зона смещения на четыре часа после UT C
Возможно, под -4 вы имеете в виду часовой пояс, такой как America/Martinique
, America/Aruba
или America/Puerto_Rico
.
ZoneId z = ZoneId.of( "America/Puerto_Rico" ) ;
Instant
+ ZoneId
➡ ZonedDateTime
Примените это ZoneId
для создания ZonedDateTime
объекта. Тот же момент, другое время настенных часов.
ZonedDateTime zdt = instant.atZone( z ) ;
Генерация текста
Создание строки в стандартном формате ISO 8601 , разумно расширенной, чтобы добавить название зоны в квадратных скобках.
String output = zdt.toString() ;
Но вы хотели формат, подобный ISO 8601 , но без T
в середине и без индикатора смещения / зоны. Я не рекомендую сообщать момент без представления часового пояса или смещения. Но если вы настаиваете:
String output =
zdt
.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )
.replace( "T" , " " )
;