LocalDateTime для определенного часового пояса - PullRequest
0 голосов
/ 29 мая 2019

У меня есть localdatetime объект, который находится в UTC. Я хочу конвертировать в IST. Как я могу это сделать?

LocalDateTime dateTimeOfAfterFiveDays = LocalDateTime.ofEpochSecond(after5,0,ZoneOffset.UTC);

Ответы [ 3 ]

4 голосов
/ 29 мая 2019

Начиная с Java 8, с API даты / времени работать довольно легко.

В вашем случае:

// your local date/time with no timezone information
LocalDateTime localNow = LocalDateTime.now();
// setting UTC as the timezone
ZonedDateTime zonedUTC = localNow.atZone(ZoneId.of("UTC"));
// converting to IST
ZonedDateTime zonedIST = zonedUTC.withZoneSameInstant(ZoneId.of("Asia/Kolkata"));

Вы увидите разницу во времени (и, возможно, в дате) между zonedUTC и zonedIST, отражающую смещение часового пояса между ними.

Обратите внимание на использование withZoneSameInstant здесь, например. в отличие от withZoneSameLocal.

1 голос
/ 29 мая 2019

ТЛ; др

Используйте 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 ) ;
0 голосов
/ 29 мая 2019

В Java 8 вы можете использовать ZonedDateTime для преобразования LocalDateTime относительно определенного ZoneId . Учитывая ваш пример, преобразование может быть реализовано следующим образом:

ZoneId istZoneId = ZoneId.of("Asia/Kolkata");
LocalDateTime dateTimeOfAfterFiveDays = LocalDateTime.ofEpochSecond(after5,0,ZoneOffset.UTC);
ZonedDateTime zonedDateTimeOfAfterFiveDays = dateTimeOfAfterFiveDays.atZone(istZoneId);

Надеюсь, это поможет!

...