java - 如何更改 Java 的 ZonedDateTime 中的时区

标签 java timezone zoneddatetime date

我的意思是这个。假设我有一个日期对象,为 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/

相关文章:

java - SoapFaultException - 提取代码和文本

java - 如何在递归期间将值从所有先前帧(较高帧)传递到较低帧

java - org.apache.poi.openxml4j.exceptions.OpenXML4JRuntimeException - 写入 docx 时出错

python - Pandas.tslib.normalize_date() 时区知道吗?

javascript - 在 Javascript 中使用不同时区

java - 使得元素之和小于或等于 k ​​的方式总数

ruby-on-rails - 在 ruby​​ 中以任意 gmt 偏移量解析时间

java - 如何转换 yyyy DDD HH :mm:ss into a ZonedDateTime>

java - 如何格式化 ZonedDateTime