我的意思是这个。假设我有一个日期对象,为 2018 年 5 月 1 日凌晨 12:00。我想创建一个 ZonedDateTime
对象,该对象的日期为 2018 年 5 月 1 日凌晨 12:00,但属于另一个时区(例如美国东部时间)。因为如果我将该日期对象传递给 ZonedDateTime
,它会将该日期对象视为 UTC(因此它将其视为 2018 年 5 月 1 日凌晨 12:00 GMT),并且我希望它保留该日期字段值,但将 timzeone 更改为 EST(2018 年 5 月 1 日,美国东部时间上午 12:00)。 Java 有没有办法做到这一点?
最佳答案
您需要的是LocalDate
:
LocalDate date = LocalDate.of(2018, Month.MAY, 1);
所有时区都可以理解这一点,并且永远不会是 5 月 1 日以外的任何时间。 java.time
中此类名和其他类名中的“Local”意思是“没有时区”。
如果您确实坚持 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[Australia/Brisbane]
不要依赖 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
关于java - 如何更改 Java 的 ZonedDateTime 中的时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50132522/