繁体   English   中英

如何在Java的ZonedDateTime中更改时区

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM