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?
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?
避免使用System.currentTimeMillis()创建 Date 对象。除以 1000 即可进入 Unix 纪元。
正如评论中提到的,对于 unixTime 变量的类型,您通常需要一个原始 long(小写-l long)而不是装箱对象 long(大写-L Long)。
long unixTime = System.currentTimeMillis() / 1000L;
Java 8 添加了一个用于处理日期和时间的新 API。使用 Java 8,您可以使用
import java.time.Instant
...
long unixTimestamp = Instant.now().getEpochSecond();
Instant.now()
返回一个表示当前系统时间的Instant 。随着getEpochSecond()
您从Instant
.
已经有两个很好的答案。在新副本的情况下,我在两个方向上更深入地潜水:
如果您仍在使用 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
只是Instant
s,因为 Java 17 不再使用Clock
. 使用InstantSource
.
InstantSource instantSource
= InstantSource.fixed(Instant.ofEpochSecond(1_654_321_098));
long unixTime = instantSource.instant().getEpochSecond();
1654321098
java.time
第一次描述的地方。java.time
Java 6 和 7 的反向移植(ThreeTen for JSR-310)。