gpt4 book ai didi

java - 从 GregorianCalendar 获取日期

转载 作者:行者123 更新时间:2023-11-30 10:35:49 25 4
gpt4 key购买 nike

GregorianCalendar 不一致:

Calendar cal = new GregorianCalendar(2000, 0, 1);
long testCalOne = cal.getTimeInMillis();
cal.setTimeZone(TimeZone.getTimeZone("UTC"));
long testCalTwo = cal.getTimeInMillis();

Calendar cal2 = new GregorianCalendar(2000, 0, 1);
cal2.setTimeZone(TimeZone.getTimeZone("UTC"));
long testCalThree = cal2.getTimeInMillis();

System.out.println(testCalOne + ", " + testCalTwo + ", " + testCalThree);

结果

946681200000, 946681200000, 946684800000

这分别表示 GMT+1、GMT+1 和 UTC 的 2000-01-01 午夜。我的时区相对于 UTC 是 +1 小时。

这里的问题是 getTimeInMillis 应该以 UTC 返回自 1970-01-01 以来的毫秒数。只有 testCalThree 是正确的。

另一个问题是 setTimeZone 似乎不起作用,这取决于我之前是否调用了 getTimeInMillis。

我的目标是获取我从其他代码接收到的日历作为参数并获取 UTC (java.util) 日期以供进一步使用。

最佳答案

tl;dr

myGregCal.toZonedDateTime()
.toInstant()

……或者……

java.util.Date.from(
myGregCal.toZonedDateTime()
.toInstant()
)

java.time

My goal is to take a Calendar I receive as parameter from other code and get a UTC (java.util) Date for further use.

CalendarDate 的麻烦的旧日期时间类现在已经遗留,由 java.time 类取代。幸运的是,您可以通过在旧类上调用新方法来与 java.time 相互转换。

ZonedDateTime zdt = myGregCal.toZonedDateTime() ;

对于 UTC 值,提取一个 Instant。该类代表 UTC 时间轴上的一个时刻,分辨率为纳秒。

Instant instant = zdt.toInstant() ;

要生成表示标准 ISO 8601 格式的 UTC 值的字符串,请调用 toString

String output = instant.toString() ;

如果您需要在生成的字符串中使用其他格式,请转换为更灵活的 OffsetDateTime 并使用 DateTimeFormatter。在 Stack Overflow 中搜索许多示例。

最好避免使用 Date 类。但如果你必须,转换。与 Instant 一样,Date 表示 UTC 时间轴上的一个点。但是 Date 仅限于毫秒分辨率。因此,您冒着数据丢失的风险,将超过 3 位毫秒数与 9 位纳秒数的秒的小数部分截掉。

java.util.Date utilDate = Date.from( instant ) ;

关于java.time

java.time框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧类 legacy日期时间类,例如 java.util.Date , Calendar , & SimpleDateFormat .

Joda-Time项目,现在在maintenance mode , 建议迁移到 java.time。

要了解更多信息,请参阅 Oracle Tutorial .并在 Stack Overflow 中搜索许多示例和解释。规范为 JSR 310 .

从哪里获得 java.time 类?

ThreeTen-Extra项目用附加类扩展 java.time。该项目是 future 可能添加到 java.time 的试验场。您可能会在这里找到一些有用的类,例如 Interval , YearWeek , YearQuarter , 和 more .

关于java - 从 GregorianCalendar 获取日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40929014/

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