java - 从 GregorianCalendar 获取日期

标签 java date datetime java-7

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/

相关文章:

java - Reactive Mongo - DeleteAllBy...查询 - 找不到类型类 java.lang.Void 的 PersistentEntity

java - Spring 4中如何使用fasterxml Jackson JSON序列化

java - hibernate - 约束名称

java - Java中的模运算,Android问题

python - 如何使用python将日期转换为指定格式?

Java Swing UI 布局

javascript - 为什么 Date.parse 给出不正确的结果?

cocoa - 为什么 Cocoa 的 [NSDate distancePast] 不等于从字符串初始化的相同日期?

java - 如何识别日期时间格式?

javascript - asp.net mvc datetime 通过客户端日期格式进行动态验证