287

Date.getTime() 返回自 1970 年 1 月 1 日以来的毫秒数。Unixtime 是自 1970 年 1 月 1 日以来的秒数。我通常不使用 java 编码,但我正在修复一些错误。我有:

Date now = new Date();      
Long longTime = new Long(now.getTime()/1000);
return longTime.intValue();

有没有更好的方法在java中获取unixtime?

4

3 回答 3

514

避免使用System.currentTimeMillis()创建 Date 对象。除以 1000 即可进入 Unix 纪元。

正如评论中提到的,对于 unixTime 变量的类型,您通常需要一个原始 long(小写-l long)而不是装箱对象 long(大写-L Long)。

long unixTime = System.currentTimeMillis() / 1000L;
于 2009-04-08T21:58:38.820 回答
298

Java 8 添加了一个用于处理日期和时间的新 API。使用 Java 8,您可以使用

import java.time.Instant
...
long unixTimestamp = Instant.now().getEpochSecond();

Instant.now()返回一个表示当前系统时间的Instant 。随着getEpochSecond()您从Instant.

于 2014-07-11T17:44:30.743 回答
1

已经有两个很好的答案。在新副本的情况下,我在两个方向上更深入地潜水:

  1. 在 Java 7 上做什么?
  2. 如何编写可测试的版本?

对于 Java 7

如果您仍在使用 Java 7,您仍然可以选择要使用的其他答案中的哪一个。Micha 提到 java.time 是在 Java 8 中引入的。但 java.time 也已在 ThreeTen Backport 中向后移植到 Java 6 和7。获取 Unix 时间戳可能看起来有点过分,但是如果你在你的程序中做更多的日期和时间工作,我仍然认为你应该考虑它。底部有链接。

在您自己的代码中除以 1000 似乎是一件非常小的事情。我仍然养成了将尽可能多的日期和时间工作留给标准库的习惯,最好是 java.time。还有很多其他情况,转换似乎很容易,但很容易出错。所以我不想在我的代码中做它们。所以我的纯 Java 7 解决方案(没有外部库/backport)可能看起来像这样:

    long unixTime = TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis());
    System.out.println(unixTime);

1636883947

现在我还要告诉读者我为什么要除以 1000。虽然代码有点长,但它也更加不言自明。

更可测试

java.time 还为 Java 7 和 8 及更高版本提供了可测试的解决方案。我们可以注入一个Clock当前时间的来源。

    Clock clock = Clock.systemUTC();
    long unixTime = Instant.now(clock).getEpochSecond();
    System.out.println(unixTime);

刚才的输出:

1636882578

(我使用 ThreeTen Backport 1.3.6 在 Java 1.7.0_67 上运行它。)

在您需要控制用于可重现结果的时间的测试中,例如获取具有固定时间的时钟:

    Clock clock = Clock.fixed(Instant.ofEpochSecond(1_635_936_963), ZoneOffset.UTC);

现在代码的输出是我们指定的时间:

1635936963

如果你想要的Clock只是Instants,因为 Java 17 不再使用Clock. 使用InstantSource.

    InstantSource instantSource 
            = InstantSource.fixed(Instant.ofEpochSecond(1_654_321_098));
    long unixTime = instantSource.instant().getEpochSecond();

1654321098

链接

于 2021-11-14T09:39:53.763 回答