如何在ZoneDateTime for Java中更改时区
我的意思是这个。假设我有一个日期对象是2018年5月1日12:00AM。我想创建一个如何在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
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);