Unix纪元到Java Date对象的时间


84

我有一个包含UNIX Epoch time的字符串,我需要将其转换为Java Date对象。

String date = "1081157732";
DateFormat df = new SimpleDateFormat(""); // This line
try {
  Date expiry = df.parse(date);
 } catch (ParseException ex) {
  ex.getStackTrace();
}

标记的行是我遇到麻烦的地方。我无法计算出SimpleDateFormat()的参数是什么,或者即使我应该使用SimpleDateFormat()。


请参阅的类似问题的详细答案,该问题有关使用Joda-Time库的示例代码在毫秒之间转换为日期时间。
罗勒·布尔克

private String getDateString(long timeInMilliseconds) { SimpleDateFormat formatter = new SimpleDateFormat("EEE, d MMM yyyy 'at' HH:mm:ss z"); return formatter.format(timeInMilliseconds); }
JVJplus

Answers:


125

怎么样:

Date expiry = new Date(Long.parseLong(date));

编辑:根据rde6173的答案,并仔细查看问题中指定的输入,“ 1081157732”似乎是基于秒的纪元值,因此您需要将parseLong()的long乘以1000来进行转换到毫秒,这是Java的Date构造函数使用的时间,因此:

Date expiry = new Date(Long.parseLong(date) * 1000);

4
从技术上来说这不正确,因为它没有考虑leap秒吗?
Maciej Piechotka,2011年

1
Maciej,op的“基于秒”的时代已经说明了leap秒,它是基于“秒”的。所以这个答案是正确的。
Thecarpy 2014年

1
如果乘以1000,它会给我不正确的值,是不是有更好的方法呢?
伊桑

1
仅供参考,非常麻烦旧日期,时间类,如java.util.Datejava.util.Calendarjava.text.SimpleDateFormat现在的遗产,由取代java.time内置到Java 8和更高等级。请参见Oracle教程
罗勒·布尔克

问题在于,从时代开始,即UTC,而日期预计将由格林尼治标准时间传来,它们是否相同?
路加福音

37

纪元是自1970年1月1日以来的秒数

所以:

String epochString = "1081157732";
long epoch = Long.parseLong( epochString );
Date expiry = new Date( epoch * 1000 );

有关更多信息:http : //www.epochconverter.com/


1
这工作一种对待... IDK Y,这还没有被检查为答案:)
Makky 2012年

感谢您的回答。我坐在这里尝试实例化一个日期,结果总是在1970年的某一天,这是因为我在不知不觉中给了Java毫秒,而不是秒:)
Lo-Tan

24

java.time

使用java.timeJava 8和更高版本中内置的框架。

import java.time.LocalDateTime;
import java.time.Instant;
import java.time.ZoneId;

long epoch = Long.parseLong("1081157732");
Instant instant = Instant.ofEpochSecond(epoch);
ZonedDateTime.ofInstant(instant, ZoneOffset.UTC); # ZonedDateTime = 2004-04-05T09:35:32Z[UTC]

在这种情况下,最好使用UTC时区ZonedDateTime将其标记为日期,因为Epoch是在Java使用的Unix时间的UTC中定义的。

ZoneOffset包含UTC时区的方便常量,如上面的最后一行所示。它的超类ZoneId可用于调整到其他时区。

ZoneId zoneId = ZoneId.of( "America/Montreal" );

好答案。我建议删除,LocalDateTime然后显示一个ZonedDateTime。在大多数商业应用中,这ZonedDateTime是最好的方法。人们容易陷入LocalXXX类型的麻烦/困惑中。
罗勒·布尔克

7
long timestamp = Long.parseLong(date)
Date expiry = new Date(timestamp * 1000)



-1

嗯......如果我没记错的话,UNIX Epoch时间实际上与

System.currentTimeMillis()

所以写

try {
    Date expiry = new Date(Long.parseLong(date));
}
catch(NumberFormatException e) {
    // ...
}

应该可以工作(并且日期解析要快得多)


4
通常,Unix纪元时间以秒为单位,而不是毫秒。
西蒙·尼克森
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.