我想将给定的日期时间(这是一个utc日期时间)转换为CET中相应的日期时间,并使用欧洲夏季/冬季时间开关(夏令时)的正确映射。我设法使用java.time
:
public static LocalDateTime cetToUtc(LocalDateTime timeInCet) {
ZonedDateTime cetTimeZoned = ZonedDateTime.of(timeInCet, ZoneId.of("CET"));
return cetTimeZoned.withZoneSameInstant(ZoneOffset.UTC).toLocalDateTime();
}
但我没有采取相反的方式:
public static LocalDateTime utcToCet(LocalDateTime timeInUtc) {
ZonedDateTime cetTimeZoned = ZonedDateTime.of(timeInUtc,ZoneId.of("UTC"));
return cetTimeZoned.withZoneSameInstant(ZoneOffset.of(???)).toLocalDateTime(); // what to put here?
}
我该怎么做?
答案 0 :(得分:1)
只需使用 ZoneId.of(“CET”)
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
public class Main {
public static void main(String args[])
{
LocalDateTime date = LocalDateTime.now(ZoneId.of("CET"));
System.out.println(date);
LocalDateTime utcdate = cetToUtc(date);
System.out.println(utcdate);
LocalDateTime cetdate = utcToCet(utcdate);
System.out.println(cetdate);
}
public static LocalDateTime cetToUtc(LocalDateTime timeInCet) {
ZonedDateTime cetTimeZoned = ZonedDateTime.of(timeInCet, ZoneId.of("CET"));
return cetTimeZoned.withZoneSameInstant(ZoneOffset.UTC).toLocalDateTime();
}
public static LocalDateTime utcToCet(LocalDateTime timeInUtc) {
ZonedDateTime utcTimeZoned = ZonedDateTime.of(timeInUtc,ZoneId.of("UTC"));
return utcTimeZoned.withZoneSameInstant(ZoneId.of("CET")).toLocalDateTime();
}
}
答案 1 :(得分:1)
TL; DR:在您的两种方法中,使用ZoneId.of("Europe/Rome")
(或CET时区中您最喜欢的城市)和ZoneOffset.UTC
。
正如Jerry06在评论中所说,再次使用ZoneId.of("CET")
有效(你已经在第一种方法中使用过它)。
但是,不建议使用三个字母的时区缩写,其中许多都不明确。他们建议您使用其中一个城市时区ID,例如ZoneId.of("Europe/Rome")
用于CET(这将从昨天开始为您提供CEST)。他们也推荐ZoneId.of("UTC")
而不是ZoneOffset.UTC
。传递ZoneOffset
有效,因为ZoneOffset
是ZoneId
的子类之一。