LocalDateTime到特定时区

时间:2019-05-29 13:03:09

标签: java java-time

我有一个使用UTC的localdatetime对象。我想转换为IST。 我该怎么办?

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

3 个答案:

答案 0 :(得分:4)

自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"));

您将看到zonedUTCzonedIST之间的时间(可能还有日期)有所不同,反映了两者之间的时区偏移。

请注意此处withZoneSameInstant的用法,例如与withZoneSameLocal相反。

答案 1 :(得分:1)

tl; dr

使用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(after5,0,ZoneOffset.UTC);

LocalDateTime是在此处使用的错误的类。这堂课不能代表片刻。它缺少任何时区或UTC偏移的概念。 LocalDateTime仅包含日期和时间,例如今年1月23日中午。但是我们不知道预定的时间是东京的中午,加尔各答的中午,巴黎的中午还是蒙特利尔的中午-所有这些都是相隔几个小时,非常不同的时刻。

Instant

要使用UTC表示时刻,请使用Instant

显然,自1970年UTC的第一时刻的纪元参考以来,您就有整秒的计数。

Instant instant = Instant.ofEpochSecond( count ) ;

ZoneIdZonedDateTime

要通过特定区域(时区)的人们使用的挂钟时间查看此值,请应用ZoneId以获得ZonedDateTime

Continent/Region的格式指定proper time zone name,例如America/MontrealAfrica/CasablancaPacific/Auckland。切勿使用2-4个字母的缩写,例如ESTIST,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

ZoneId z = ZoneId.of( "Asia/Kolkata" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;

答案 2 :(得分:0)

在Java 8中,您可以使用ZonedDateTime来将LocalDateTime转换为特定的ZoneId。考虑到您的示例,可以按以下方式实现转换:

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

希望有帮助!