简而言之
myGregCal.toZonedDateTime().toEpochSecond() // Convert from troublesome legacy `GregorianCalendar` to modern `ZonedDateTime`.
而往另一个方向走...
GregorianCalendar.from( // Convert from modern `ZonedDateTime` to troublesome legacy class `GregorianCalendar`.
Instant.ofEpochSecond( yourCountOfWholeSecondsSinceEpoch ) // Moment in UTC.
.atZone( // Apply `ZoneId` to `Instant` to produce a `ZonedDateTime` object.
ZoneId.of( "Africa/Tunis" )
)
)
避免使用旧的日期时间类
其他答案都是正确而简短的。但是,值得注意的是,那些令人头疼的旧日期时间类,例如java.util.Date
、java.util.Calendar
和java.text.SimpleDateFormat
现在已经成为遗留问题,被Java 8和Java 9内置的java.time类所取代。
因此,以下是如何转换并使用现代类来解决您的问题。
java.time
将传统类GregorianCalendar
转换为现代类ZonedDateTime
。调用添加到旧类的新方法。
ZonedDateTime zdt = myGregCal.toZonedDateTime() ;
而往另一个方向走...
GregorianCalendar myGregCal = GregorianCalendar.from( zdt ) ;
如果你所说的“Unix时间”是指自1970年1月1日UTC的第一个时刻,即1970-01-01T00:00:00Z以来的整秒数计数,请调用
toEpochSecond
。若需要了解更多信息,请参考{{link1:“Unix时间”}}和{{link2:纪元参考}}。
long secondsSinceEpoch = zdt.toEpochSecond() ;
如果您想要一个自1970年以来以UTC为基准的毫秒计数,请提取一个Instant
。Instant
类表示时间线上的一个时刻,使用UTC作为参考,并具有纳秒的分辨率(最多九位小数)。
Instant instant = zdt.toInstant() ;
现在
询问毫秒数的计数。
long millisecondsSinceEpoch = instant.toEpochMill() ;
请记住,要求整秒或
毫秒可能会涉及数据损失。
ZonedDateTime
和
Instant
都解析为纳秒。 因此,在计算整秒或毫秒时,任何可能存在的
微秒或纳秒都将被忽略。
关于 java.time
java.time 框架内置于 Java 8 及更高版本。这些类取代了老旧的 遗留 日期时间类,如 java.util.Date
、Calendar
和 SimpleDateFormat
。
Joda-Time 项目目前处于 维护模式,建议迁移到 java.time 类。
要了解更多信息,请参阅 Oracle 教程。并在 Stack Overflow 上搜索许多示例和说明。规范是 JSR 310。
使用符合 JDBC 4.2 或更高版本的 JDBC 驱动程序,您可以直接与数据库交换 java.time 对象。无需使用字符串或 java.sql.* 类。
如何获取 java.time 类?
ThreeTen-Extra 项目通过添加额外的类扩展了 java.time。该项目是 java.time 可能未来增加内容的试验场。您可能会在这里找到一些有用的类,例如 Interval
、YearWeek
、YearQuarter
和 更多。
time
方法返回整数秒数。它一直如此。还有另一个方法utime
,它使用一个具有两个long型成员变量的结构体:一个用于秒数,另一个用于微秒数。 - Erick RobertsonsetTimeInMillis
是我最后会寻找的东西。因为在 Java 1.0 中,他们有一个伟大的想法:不可变实例(String、Date、Integer、Long 等等),我不会期望在 1.1 中他们放弃了 Java 设计师曾经拥有的最好的想法。 - Martin