如何在 ZonedDateTime for Java 中更改时区

Dan*_*mes 2 java timezone date zoneddatetime

我的意思是这个。假设我有一个日期对象,它是 2018 年 5 月 1 日上午 12:00。我想创建一个ZonedDateTime对象,该对象是 2018 年 5 月 1 日上午 12:00,但属于另一个时区(例如美国东部时间)。因为如果我将该日期对象传入ZonedDateTime,它将将该日期对象视为 UTC(因此它将其视为 2018 年 5 月 1 日,格林威治标准时间上午 12:00),并且我希望它保留该日期字段值但将 timzeone 更改为 EST( 2018 年 5 月 1 日,美国东部标准时间上午 12:00)。有没有办法在 Java 中做到这一点?

Ole*_*.V. 5

你需要的是LocalDate

    LocalDate date = LocalDate.of(2018, Month.MAY, 1);
Run Code Online (Sandbox Code Playgroud)

这将在所有时区中被理解,并且永远不会是 5 月 1 日以外的任何东西。这个和其他类名中的“本地”java.time意味着“没有时区”。

如果你坚持 a ZonedDateTime,答案是withZoneSameLocal

    ZonedDateTime zdt = date.atStartOfDay(ZoneOffset.UTC);
    ZonedDateTime inEst = zdt.withZoneSameLocal(ZoneId.of("Australia/Brisbane"));
    System.out.println(inEst);
Run Code Online (Sandbox Code Playgroud)

输出:

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);
Run Code Online (Sandbox Code Playgroud)

输出:

2018-05-01