【问题标题】:Unix epoch time to Java Date objectUnix 纪元时间到 Java Date 对象
【发布时间】: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); }

标签: java date java-time


【解决方案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。解析字符串和转换成字符串要容易得多。也是线程安全的。值得您花时间实施它。

    【讨论】:

    【解决方案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 纪元时间以秒为单位,而不是毫秒。
      猜你喜欢
      • 2016-06-15
      • 2021-11-22
      • 2012-01-30
      • 2012-03-10
      • 2021-09-22
      • 1970-01-01
      • 1970-01-01
      • 2014-09-25
      • 1970-01-01
      相关资源
      最近更新 更多