Unix纪元时间转换为Java日期对象

104

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

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

我遇到问题的是这行标记。我不知道SimpleDateFormat()的参数应该是什么,甚至不确定我是否应该使用SimpleDateFormat()。


请参考我在Stack Overflow上对于将毫秒转换为日期时间的类似问题的详细回答(http://stackoverflow.com/a/20370992/642706),其中提供了使用Joda-Time库的示例代码。 - Basil Bourque
private String getDateString(long timeInMilliseconds) { SimpleDateFormat formatter = new SimpleDateFormat("EEE, d MMM yyyy 'at' HH:mm:ss z"); return formatter.format(timeInMilliseconds); } - JVJplus
7个回答

148

那就这样吧:

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

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

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

4
不考虑闰秒,这在技术上是否不正确? - Maciej Piechotka
1
Maciej,op的“基于秒”的纪元已经考虑了闰秒,它是“基于秒”的。因此,这个答案是正确的。 - thecarpy
1
如果乘以1000,它会给我错误的值,有没有更好的方法来做这件事? - Ishaan
1
请注意,像java.util.Datejava.util.Calendarjava.text.SimpleDateFormat这样的旧日期时间类现在已经成为遗留系统,被内置于Java 8及更高版本中的java.time类所取代。请参阅Oracle的教程 - Basil Bourque
问题是自纪元以来,它是UTC,而日期期望长时间从GMT,它们是相同的吗? - Luke

46

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

因此:

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

更多信息请参考:http://www.epochconverter.com/


1
这个很好用...不知道为什么没有被标记为答案 :) - Makky
谢谢你的回答。我一直在尝试从纪元实例化一个日期,结果总是在1970年某一天,原来是因为我无意中给了Java毫秒而不是秒 :) - Lo-Tan

35

java.time

使用Java 8及更高版本内置的java.time框架。

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]

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

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

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

好的回答。我建议放弃使用 LocalDateTime,而是使用 ZonedDateTime。在大多数商业应用程序中,ZonedDateTime 是最好的选择。人们往往会因为 LocalXXX 类型而陷入麻烦和困惑。 - Basil Bourque

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

0
将秒级时间戳转换为毫秒级时间戳。您可以使用TimeUnit API并像这样整洁地编写代码。 long milliSecondTimeStamp = MILLISECONDS.convert(secondsTimeStamp, SECONDS)

0
更好的方法是使用JodaTime。这样可以更轻松地解析字符串和转换成字符串。它还是线程安全的。值得花时间去实现它。

FYI,Joda-Time 项目现已进入维护模式,团队建议迁移到java.time类。请参阅Oracle的教程 - Basil Bourque

-1

嗯...如果我没记错的话,UNIX纪元时间实际上就是同一件事情。

System.currentTimeMillis()

所以写作

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

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


4
通常情况下,Unix纪元时间以秒为单位而不是毫秒为单位进行测量。 - Simon Nickerson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接