如何用Java将公历转换为Unix时间?

如何用Java将公历转换为Unix时间?,java,methods,gregorian-calendar,unix-timestamp,Java,Methods,Gregorian Calendar,Unix Timestamp,我需要一种方法将GregorianCalendar对象转换为Unix时间(即长时间)。还需要一种方法将Unix时间(long)转换回GregoriaCalendar对象。有什么方法可以做到这一点吗?如果没有,我怎么做?任何帮助都将不胜感激 链接到GregorianCalendar类--> 谢谢。我相信这一点,并且可以让您以您想要的方式获取和设置长值。查看setTimeInMillis和getTimeInMillis函数:()

我需要一种方法将GregorianCalendar对象转换为Unix时间(即长时间)。还需要一种方法将Unix时间(long)转换回GregoriaCalendar对象。有什么方法可以做到这一点吗?如果没有,我怎么做?任何帮助都将不胜感激

链接到GregorianCalendar类-->


谢谢。

我相信这一点,并且可以让您以您想要的方式获取和设置长值。

查看setTimeInMillis和getTimeInMillis函数:()

方法
getTimeInMillis()
setTimeInMillis(long)
将让您以毫秒为单位获取和设置时间,即unix时间乘以1000。您必须手动调整,因为unix时间不包括毫秒,只包括秒

long unixTime = gregCal.getTimeInMillis() / 1000; gregCal.setTimeInMillis(unixTime * 1000); long unixTime=gregCal.getTimeInMillis()/1000; gregCal.setTimeInMillis(unixTime*1000); 旁白:如果您在应用程序中经常使用日期,尤其是在转换日期或使用多个时区时,我强烈建议您使用该库。它非常完整,比Java附带的日历系统更容易理解。

tl;博士 然后往另一个方向走

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" ) 
        )
)                                                              
GregorianCalendar myGregCal = GregorianCalendar.from( zdt ) ;
避免遗留日期时间类 其他答案正确且简短。但是,仅供参考,诸如和
java.text.simpleDataFormat
之类的麻烦的旧日期时间类现在被内置在Java8和Java9中的类所取代

下面是如何转换和使用现代类来解决您的问题

java.time 从旧类
GregorianCalendar
转换为现代类
ZoneDateTime
。调用添加到旧类中的新方法

ZonedDateTime zdt = myGregCal.toZonedDateTime() ;
然后往另一个方向走

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" ) 
        )
)                                                              
GregorianCalendar myGregCal = GregorianCalendar.from( zdt ) ;
如果您指的是自1970年第一个时刻(UTC,1970-01-01T00:00:00Z)起的整秒计数,请调用
toEpochSecond

long secondsSinceEpoch = zdt.toEpochSecond() ;
如果您指的是自1970年开始以UTC为单位的毫秒计数,那么请提取一个
瞬间
。该类表示时间线上的一个时刻,分辨率为(小数点的九(9)位)

现在

请记住,索取整秒钟或更长时间可能会导致数据丢失。
zoneDateTime
Instant
都解析为纳秒。因此,在计算整个秒数或毫秒数时,可能出现的任何秒数或纳秒数都将被忽略


关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

使用兼容的或更高版本,您可以直接与数据库交换java.time对象。不需要字符串,也不需要java.sql.*类

从哪里获得java.time类

  • ,及以后
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 更高版本的Android捆绑包实现了java.time类
    • 对于早期的Android,该项目采用了ThreeTen Backport(如上所述)。看

该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,例如、、和。

Unix C编程中的
time
方法返回整数秒。总是这样。还有另一种方法
utime
,它使用一个具有两个long的结构:一个用于秒,另一个用于微秒。谢谢。一个
setTimeInMillis
大概是我最后一次找它了。因为在Java1.0中,他们对不可变的实例(String、Date、Integer、Long等.pp)有着很好的想法,并且没有想到在1.1中,他们放弃了Java设计人员有过的最好的想法。
long millisecondsSinceEpoch = instant.toEpochMill() ;