获得“unixtime"在Java中

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 ?

350667 次浏览

避免使用/ 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()返回一个表示当前系统时间的即时。使用getEpochSecond()可以从Instant中获得纪元秒(unix时间)。

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

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

适用于Java 7

如果您仍在使用Java 7,您仍然可以选择您想要使用的其他答案。Micha提到了java。时间是在Java 8中引入的。但是java。time也在ThreeTen补丁中被反向移植到Java 6和7中。对于获取Unix时间戳来说,获得backport似乎有些多余,但如果您在程序中要做更多的日期和时间工作,我仍然认为您应该考虑使用它。底部有一个链接。

同样,在您自己的代码中除以1000似乎是一件非常小的事情。尽管如此,我还是养成了习惯留下尽可能多的时间和日期工作到标准库,最好是java.time。在许多其他情况下,皈依似乎很容易,但很容易出错。所以我不想在代码中使用它们。所以我的纯Java 7解决方案(没有外部库/后端口)可能是这样的:

    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

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

在一个测试中,你需要控制使用哪个时间来获得一个可重复的结果,例如获得一个固定时间的时钟:

    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

链接