繁体   English   中英

如何在Java中将Gregorian Calendar转换为Unix Time?

[英]How can I convert from Gregorian Calendar to Unix Time, in Java?

我需要一个方法将GregorianCalendar对象转换为Unix时间(即很长)。 还需要一种方法将Unix Time(long)转换回GregorianCalendar对象。 有什么方法可以做到这一点吗? 如果没有,那我该怎么办呢? 任何帮助将受到高度赞赏。

链接到GregorianCalendar类 - > http://download.oracle.com/javase/1.4.2/docs/api/java/util/GregorianCalendar.html

谢谢。

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

long unixTime = gregCal.getTimeInMillis() / 1000;
gregCal.setTimeInMillis(unixTime * 1000);

另外 :如果您在应用程序中使用了很多日期,特别是如果您要转换日期或使用多个时区,我强烈建议您使用JodaTime库。 它比Java附带的Calendar系统更完整,更自然。

我相信GregorianCalendar.getTimeInMillis()GregorianCalendar.SetTimeInMillis()可以让你以你想要的方式获取和设置长值。

查看setTimeInMillis和getTimeInMillis函数: http//download.oracle.com/javase/6/docs/api/java/util/Calendar.html#getTimeInMillis ()

Calendar.getTimeInMillis()应该是您正在寻找的。

TL;博士

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.Datejava.util.Calendarjava.text.SimpleDateFormat现在是遗留的 ,取而代之的是Java 8和Java 9中内置的java.time类。

所以这里是如何转换和使用现代类代替您的问题。

java.time

从遗留类GregorianCalendar转换为现代类ZonedDateTime 调用添加到旧类的新方法。

ZonedDateTime zdt = myGregCal.toZonedDateTime() ;

走向另一个方向......

GregorianCalendar myGregCal = GregorianCalendar.from( zdt ) ;

如果通过“Unix时间”你的意思是自1970年第一时刻的纪元参考以来在UTC,1970-01-01T00:00:00Z中的整秒数,则调用toEpochSecond

long secondsSinceEpoch = zdt.toEpochSecond() ;

如果你的意思是自1970年以UTC开始的毫秒数,那么提取一个Instant Instant类表示UTC时间轴上的一个时刻,分辨率为纳秒 (最多九(9)位小数)。

Instant instant = zdt.toInstant() ;

现在要求计算毫秒数

long millisecondsSinceEpoch = instant.toEpochMill() ;

请记住,要求整秒或毫秒可能会导致数据丢失。 ZonedDateTimeInstant都解析为纳秒。 因此,当您计算整秒或毫秒时,将忽略可能存在的任何微秒或纳秒。


关于java.time

java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧遗留日期时间类,如java.util.DateCalendarSimpleDateFormat

现在处于维护模式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的试验场。 您可以在这里找到一些有用的类,比如IntervalYearWeekYearQuarter ,和更多

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM