gpt4 book ai didi

java - 如何使用 XMLGregorianCalendar 将 CST 处理为 CDT,反之亦然

转载 作者:行者123 更新时间:2023-12-02 02:13:27 26 4
gpt4 key购买 nike

在日光变化 CST-CDT 重置期间,我遇到了以下问题。

我按预期从 Was8.5 服务器 2018-03-11-05.00 (UTC-5) 获取输入,但是当涉及到 WAS7 服务器时,以下方法返回 Sun Mar 10 00.00.00 CST 2018 而不是 Sun 3 月 11 日 00.00.00 CDT 2018

/*
* Converts XMLGregorianCalendar to java.util.Date
*/
public static Date toDate(XMLGregorianCalendar calendar){
if(calendar == null) {
return null;
}
return calendar.toGregorianCalendar().getTime();
}

我知道服务器日期/时区重置没有正确进行,但如果我想在 CST 更改为 CDT 时获得正确的时间,反之亦然。如何重写代码以将 XMLGregorianCalendar 转换为 Java 中的 java.util.Date

比如,如果传入请求是 CST(UTC-6),则 toDate(XMLGregorianCalendar calendar) 返回 CDT (UTC-5)。那么我希望 toDate() 应该返回 CST (UTC-6)。

同样的方法,

如果传入请求是 CDT(UTC-5),则 toDate(XMLGregorianCalendar 日历) 返回 CST(UTC-6)。那么我想 toDate() 应该返回 CDT(UTC-5)。

最佳答案

java.util.Date 没有时区。它只有一个 long 值,表示自 unix 纪元以来的毫秒数。

您看到的 (Sun Mar 10 00.00.00 CST 2018) 是 toString() 方法的结果,它使用 JVM 默认时区来转换 long 值为该时区的日期和时间。请参阅这篇文章了解更多详细信息: https://codeblog.jonskeet.uk/2017/04/23/all-about-java-util-date/

无论如何,真正了解发生情况的一种方法是检查这个 long 值:

long millis = calendar.toGregorianCalendar().getTimeInMillis();

然后您可以以 UTC 格式打印该值:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss XXX");
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
System.out.println(sdf.format(new Date(millis)));

或者,如果您使用 Java 8:

System.out.println(Instant.ofEpochMilli(millis));

这将告诉您 Date 对应的 UTC 时刻,因此您可以比依赖 Date::toString() 方法更好地调试代码,这是令人困惑和误导的。

关于您的主要问题,我尝试重现(我使用 Java 8,因为它比使用 Date 更容易操作)。首先,我创建了一个与 UTC-05:00 中的 2018-03-11 相对应的日期/时间,并假设时间为午夜:

// March 11th 2018, midnight, UTC-05:00
OffsetDateTime odt = OffsetDateTime.parse("2018-03-11T00:00-05:00");

然后我将其转换为 America/Chicago 时区,即 zone that uses CST/CDT :

// get the same instant in Central Time
ZonedDateTime zdt = odt.atZoneSameInstant(ZoneId.of("America/Chicago"));

然后我打印了这个:

// print the date/time with timezone abbreviation
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm xxx z", Locale.US);
System.out.println(zdt.format(fmt)); // 2018-03-10 23:00 -06:00 CST

请注意,结果为2018-03-10 23:00 -06:00 CST:3 月 10 日 UTC-06:00。

那是因为在2018年,Daylight Saving Time starts only at 2 AM of March 11th 。午夜时分,DST 尚未开始,因此偏移量仍为 UTC-06:00。

无论如何,您的转换代码是正确的,因为Date仅代表一个时间点(自纪元以来耗时的计数)并且没有附加时区。也许问题出在某个地方,检查 millis 值可能会帮助您了解发生了什么(我的猜测是 XmlGregorianCalendar 在不存在时将时间设置为午夜,这可以解释 2018 年 CST 3 月 10 日星期日 00.00.00)。

如果这有帮助,DST 转换发生的确切 UTC 时刻(2018 年 3 月 11 日凌晨 2 点,UTC-06:00)对应于毫秒值 1520755200000。如果 2018 年 3 月的日期值低于该值,则意味着它们在 DST 开始之前,并且将采用 CST。

关于java - 如何使用 XMLGregorianCalendar 将 CST 处理为 CDT,反之亦然,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49624705/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com