ТЛ; др
Используйте Instant
, а не LocalDateTime
для отслеживания момента.
Instant // Represents a moment in UTC with a resolution of nanoseconds.
.ofEpochSecond(
myCountOfWholeSecondsSinceStartOf1970UTC // Internally, time is tracked as a count of seconds since 1970-01-01T00:00Z plus a fractional second as nanoseconds.
) // Returns a moment in UTC.
.atZone( // Adjust from UTC to another time zone. Same moment, different wall-clock time.
ZoneId.of( "Asia/Kolkata" ) // Specify time zone name in `Continent/Region` format, never 2-4 letter pseudo-zone.
) // Returns a `ZonedDateTime` object.
.toString() // Generate a string representing the value of this `ZonedDateTime` in standard ISO 8601 format extended to append the name of the time zone in square brackets.
Неправильный класс
LocalDateTime dateTimeOfAfterFiveDays = LocalDateTime.ofEpochSecond (после 5,0, ZoneOffset.UTC);
LocalDateTime
- это неправильный класс для использования здесь. Этот класс не может представлять момент. В нем отсутствует какая-либо концепция часового пояса или смещения от UTC. LocalDateTime
содержит только дату и время суток, скажем, полдень 23 января этого года. Но мы понятия не имеем, был ли запланирован полдень в Токио, полдень в Калькутте, полдень в Париже или полдень в Монреале - все это с разницей в часы, совершенно разные моменты.
Instant
Чтобы представить момент в UTC, используйте Instant
.
Очевидно, у вас есть счетчик целых секунд с начала отсчета эпохи первого момента 1970 года в UTC.
Instant instant = Instant.ofEpochSecond( count ) ;
ZoneId
& ZonedDateTime
Чтобы увидеть это значение через часы настенного времени, используемые людьми определенного региона (часового пояса), примените ZoneId
, чтобы получить ZonedDateTime
.
Укажите собственное имя часового пояса в формате Continent/Region
, например America/Montreal
, Africa/Casablanca
или Pacific/Auckland
. Никогда не используйте 2-4 буквенные сокращения, такие как EST
или IST
, так как они не истинные часовые пояса, не стандартизированы и даже не уникальны (!).
ZoneId z = ZoneId.of( "Asia/Kolkata" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;