我有一个使用UTC的localdatetime
对象。我想转换为IST。
我该怎么办?
LocalDateTime dateTimeOfAfterFiveDays = LocalDateTime.ofEpochSecond(after5,0,ZoneOffset.UTC);
答案 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"));
您将看到zonedUTC
和zonedIST
之间的时间(可能还有日期)有所不同,反映了两者之间的时区偏移。
请注意此处withZoneSameInstant的用法,例如与withZoneSameLocal
相反。
答案 1 :(得分:1)
使用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 ) ;
ZoneId
和ZonedDateTime
要通过特定区域(时区)的人们使用的挂钟时间查看此值,请应用ZoneId
以获得ZonedDateTime
。
以Continent/Region
的格式指定proper time zone name,例如America/Montreal
,Africa/Casablanca
或Pacific/Auckland
。切勿使用2-4个字母的缩写,例如EST
或IST
,因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。
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);
希望有帮助!