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.Date
、java.util.Calendar
和 java.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 对象的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Python 中将日期时间对象转换为自纪元(unix 时间)以来的毫秒数?
如何将 Unix 纪元时间戳与 SQL 中的 DATE 进行比较?