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

时间:2010-10-25 20:17:45

标签: java methods gregorian-calendar unix-timestamp

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

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

感谢。

5 个答案:

答案 0 :(得分:29)

方法getTimeInMillis()setTimeInMillis(long)将让您获得并设置以毫秒为单位的时间,即unix时间乘以1000.您必须手动调整,因为unix时间不包括毫秒 - 只有几秒钟。

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

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

答案 1 :(得分:1)

我相信GregorianCalendar.getTimeInMillis()GregorianCalendar.SetTimeInMillis()会让您按照自己的方式设置长值。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

Calendar.getTimeInMillis()应该是你要找的东西。

答案 4 :(得分:0)

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现在是legacy,取而代之的是内置的java.time类Java 8& Java 9.

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

java.time

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

ZonedDateTime zdt = myGregCal.toZonedDateTime() ;

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

GregorianCalendar myGregCal = GregorianCalendar.from( zdt ) ;

如果按“Unix time”表示自UTC 1970,101-01-01T00:00:00Z 1970年第一时刻epoch reference以来的整秒数,则调用toEpochSecond

long secondsSinceEpoch = zdt.toEpochSecond() ;

如果您的意思是自1970年以UTC开始的毫秒数,则提取InstantInstant类代表UTC中时间轴上的一个时刻,分辨率为nanoseconds(小数部分最多九(9)位)。

Instant instant = zdt.toInstant() ;

现在ask for the count of milliseconds

long millisecondsSinceEpoch = instant.toEpochMill() ;

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

关于 java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

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

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore