如何在ZoneDateTime for Java中更改时区

如何在ZoneDateTime for Java中更改时区,java,timezone,zoneddatetime,date,Java,Timezone,Zoneddatetime,Date,我的意思是这个。假设我有一个日期对象是2018年5月1日12:00AM。我想创建一个ZonedDateTime对象,它是2018年5月1日12:00AM,但属于另一个时区(比如EST)。因为如果我将该日期对象传递到ZonedDateTime,它将该日期对象视为UTC(因此它将其视为2018年5月1日,格林威治标准时间12:00AM),我希望它保留该日期字段值,但将timzeone更改为EST(2018年5月1日,美国东部时间12:00AM)。在Java中有这样做的方法吗?您需要的是一个Local

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

您需要的是一个
LocalDate

    LocalDate date = LocalDate.of(2018, Month.MAY, 1);
这在所有时区都会被理解,而且永远不会是5月1日以外的任何事情。
java.time
中此类名和其他类名中的“Local”表示“无时区”

如果您坚持使用
ZoneDateTime
,答案是
带区域Melocal

    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不明确(在北美和澳大利亚都使用),并且不是时区(使用时间不到半年)。取而代之的是地区/城市,例如美国/阿提科坎

如果“日期对象”是指过时的
java.util.date
类的对象(如果可以,请尽量避免使用,最好使用
java.time
中的现代类):

输出:

2018-05-01


听起来你需要的是一个
LocalDate
——一个没有时间和时区的日期。在任何情况下,您的问题的答案都是
ZoneDateTime.withZoneSameLocal()
。可能是重复的
    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);