Похоже, вы используете API java.time
, у которого есть ZonedDateTime. Вероятно, вы должны использовать его вместо LocalDateTime
, так как LocalDateTime
не имеет часового пояса. Из документов:
Дата, без по времени зоны в календарной системе ISO-8601, например, 2007-12-03.
Этот класс не хранит и не представляет собой временной или часовой пояс. Вместо этого это описание даты, используемой для дней рождения. Он не может представлять мгновение на временной линии без дополнительной информации, такой как смещение или временная зона.
И затем, ZonedDateTime
docs states that:
Даты, время с временной зоной в календарной системе ISO-8601, например, 2007-12-03T10: 15: 30 + 01: 00 Европа /Париж.
Этот класс обрабатывает преобразование из локальной временной линии LocalDateTime в мгновенную линию Instant. Разница между двумя временными линиями - это смещение от UTC/Greenwich, представленное ZoneOffset.
Использование ZonedDateTime
, ваш код будет, как:
import java.time._
import java.time.format._
val zoneId = ZoneId.of("America/Los_Angeles")
val formatter = DateTimeFormatter.ofPattern("y-M-d H:m:s").withZone(zoneId)
val zdt = ZonedDateTime.parse("2011-01-11 01:51:10", formatter)
Результат вы увидите на консоли будет:
zdt: java.time.ZonedDateTime = 2011-01-11T01:51:10-08:00[America/Los_Angeles]
Это происходит потому, что вы используете default toString method of ZonedDateTime
и похоже, что DateTimeFormatter.ISO_OFFSET_DATE_TIME
- это именно то, что вы хотите. Так что ваш код должен быть:
import java.time._
import java.time.format._
val zoneId = ZoneId.of("America/Los_Angeles")
val formatter = DateTimeFormatter.ofPattern("y-M-d H:m:s").withZone(zoneId)
val zdt = ZonedDateTime.parse("2011-01-11 01:51:10", formatter)
val formatted: String = zdt.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME)
Я не уверен, что понимаю. «LocalDateTime» не имеет концепции часового пояса. – Tunaki
уверен, мне хотелось бы вернуться назад '8 часов', применив смещение – daydreamer
Что вы пытаетесь преобразовать * в *? Какой-то другой часовой пояс? УНИВЕРСАЛЬНОЕ ГЛОБАЛЬНОЕ ВРЕМЯ? Как указано в настоящее время, вы создаете «ZonedDateTime», который является местным временем и часовым поясом, который вы предоставили. (1:51:10 утра в тихоокеанское время), вы ничего с этим не делаете. Вероятно, вы хотите '.toInstant()' или '.withZoneSameInstant (someOtherZone)'. –