Unix 纪元时间到 Java Date 对象

Posted

技术标签:

【中文标题】Unix 纪元时间到 Java Date 对象【英文标题】:Unix epoch time to Java Date object 【发布时间】:2010-10-06 19:22:08 【问题描述】:

我有一个包含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()。

【问题讨论】:

请参阅my detailed answer 以使用 Joda-Time 库的示例代码在毫秒到日期时间之间转换的类似问题。 private String getDateString(long timeInMilliseconds) SimpleDateFormat formatter = new SimpleDateFormat("EEE, d MMM yyyy 'at' HH:mm:ss z"); return formatter.format(timeInMilliseconds); 【参考方案1】:

怎么样:

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

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

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

【讨论】:

这在技术上是不是不正确,因为它没有考虑闰秒? Maciej,op 的“基于秒”的时代已经考虑了闰秒,它是基于“秒”的。所以这个答案是正确的。 如果乘以 1000 会得到不正确的值,难道没有更好的方法吗? 仅供参考,非常麻烦的旧日期时间类,例如 java.util.Datejava.util.Calendarjava.text.SimpleDateFormat 现在是 legacy,被 Java 8 中内置的 java.time 类所取代,之后。见Tutorial by Oracle。 问题是从纪元开始,即UTC,而日期预计长从格林威治标准时间开始,它们是否相同?【参考方案2】:

Epoch 是自 1970 年 1 月 1 日以来的 ..

所以:

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

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

【讨论】:

这是一种享受...IDK Y 这还没有被检查为答案:) 感谢您的回答。我坐在这里试图从一个纪元实例化一个日期,结果总是在 1970 年的某一天,这是因为我在不知不觉中给了 Java 毫秒,而不是秒 :)【参考方案3】:

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 time 中,Epoch 是用UTC 定义的。

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

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

【讨论】:

好答案。我建议放弃LocalDateTime,只显示ZonedDateTime。在大多数商业应用程序中,ZonedDateTime 是最好的选择。人们往往会因LocalXXX 类型而陷入麻烦/困惑。【参考方案4】:
long timestamp = Long.parseLong(date)
Date expiry = new Date(timestamp * 1000)

【讨论】:

【参考方案5】:

更好的是,使用JodaTime。解析字符串和转换成字符串要容易得多。也是线程安全的。值得您花时间实施它。

【讨论】:

仅供参考,Joda-Time 项目现在位于maintenance mode,团队建议迁移到java.time 类。见Tutorial by Oracle。【参考方案6】:

将秒时间戳转换为毫秒时间戳。您可以像这样使用 TimeUnit API 和整洁。

long milliSecondTimeStamp = MILLISECONDS.convert(secondsTimeStamp, SECONDS)

【讨论】:

【参考方案7】:

嗯....如果我没记错的话,UNIX Epoch时间其实和

System.currentTimeMillis()

这么写

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

catch(NumberFormatException e) 
    // ...

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

【讨论】:

通常 Unix 纪元时间以秒为单位,而不是毫秒。

以上是关于Unix 纪元时间到 Java Date 对象的主要内容,如果未能解决你的问题,请参考以下文章

Moment.js 和 Unix 纪元转换

如何在 Python 中将日期时间对象转换为自纪元(unix 时间)以来的毫秒数?

如何将 Unix 纪元时间戳与 SQL 中的 DATE 进行比较?

oracle 将 unix 纪元时间转换为日期

用于在 GMT 中获取 UNIX 时间戳的快速 Java 6 实现

日期时间和熊猫之间的 Unix 纪元值不匹配