[英]How to change timezone in ZonedDateTime for Java
我的意思是这个。 假设我有一个日期对象是2018年5月1日上午12:00。 我想创建一个ZonedDateTime
对象,该对象是2018年5月1日上午12:00但具有ZonedDateTime
时区(例如EST)。 因为如果我将该日期对象传递给ZonedDateTime
,它将日期对象视为UTC(因此将其视为2018年5月1日,格林尼治标准时间12:00 AM),我希望它保留该日期字段值,但将timzeone更改为EST (2018年5月1日,美国东部标准时间12:00)。 有没有办法用Java做到这一点?
您需要的是LocalDate
:
LocalDate date = LocalDate.of(2018, Month.MAY, 1);
在所有时区都可以理解这一点,并且从5月1日起就不会出现其他情况java.time
中此类和其他类名称中的“本地”表示“无时区”。
如果您确实坚持使用ZonedDateTime
,则答案是withZoneSameLocal
:
ZonedDateTime zdt = date.atStartOfDay(ZoneOffset.UTC);
ZonedDateTime inEst = zdt.withZoneSameLocal(ZoneId.of("Australia/Brisbane"));
System.out.println(inEst);
输出:
2018-05-01T00:00 + 10:00 [澳大利亚/布里斯班]
不要依赖EST或其他三个和四个字母的时区缩写。 例如,EST不明确(在北美和澳大利亚都使用),并且不是时区(使用不到半年)。 而是提供地区/城市,例如America / Atikokan。
如果“日期对象”是指过时的java.util.Date
类的对象(如果可以的话,请避免使用它们,请使用java.time
的现代类):
Date oldfashionedDate = // …;
OffsetDateTime dateTime = oldfashionedDate.toInstant().atOffset(ZoneOffset.UTC);
if (! dateTime.toLocalTime().equals(LocalTime.MIDNIGHT)) {
throw new IllegalStateException("java.util.Date was supposed to be at midnight in UTC but was " + dateTime);
}
LocalDate date = dateTime.toLocalDate();
System.out.println(date);
输出:
2018-05-01
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.