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.
Calendar
和 Date
的麻烦的旧日期时间类现在已经遗留,由 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 类?
- Java SE 8和 SE 9然后
- 内置。
- 带有捆绑实现的标准 Java API 的一部分。
- Java 9 添加了一些次要功能和修复。
- Java SE 6和 SE 7
- 许多 java.time 功能在 ThreeTen-Backport 中被反向移植到 Java 6 和 7 .
- Android
- ThreeTenABP项目专门针对 Android 改编ThreeTen-Backport(如上所述)。
- 参见 How to use… .
ThreeTen-Extra项目用附加类扩展 java.time。该项目是 future 可能添加到 java.time 的试验场。您可能会在这里找到一些有用的类,例如 Interval
, YearWeek
, YearQuarter
, 和 more .
关于java - 从 GregorianCalendar 获取日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40929014/