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 ?


当前回答

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

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

适用于Java 7

如果您仍在使用Java 7,您仍然可以选择您想要使用的其他答案。Micha提到了java。时间是在Java 8中引入的。但是java。time也在ThreeTen Backport中被反向移植到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.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

因为Java 17不再使用时钟,如果你想要的只是即时时钟。使用InstantSource。

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

1654321098

链接

重复的问题如何在java中获得当前的长时间戳值,如1635936963[重复]询问java 7。 Oracle教程:Date Time解释如何使用java.time。 Java规范请求(JSR) 310,其中Java。时间是最早被描述的。 ThreeTen Backport项目,java的Backport。Java 6和7的时间(JSR-310的ThreeTen)。 通过糖化可获得Java 8+ api 问题如何测试用LocalDateTime.now()创建的日期

其他回答

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

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

适用于Java 7

如果您仍在使用Java 7,您仍然可以选择您想要使用的其他答案。Micha提到了java。时间是在Java 8中引入的。但是java。time也在ThreeTen Backport中被反向移植到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.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

因为Java 17不再使用时钟,如果你想要的只是即时时钟。使用InstantSource。

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

1654321098

链接

重复的问题如何在java中获得当前的长时间戳值,如1635936963[重复]询问java 7。 Oracle教程:Date Time解释如何使用java.time。 Java规范请求(JSR) 310,其中Java。时间是最早被描述的。 ThreeTen Backport项目,java的Backport。Java 6和7的时间(JSR-310的ThreeTen)。 通过糖化可获得Java 8+ api 问题如何测试用LocalDateTime.now()创建的日期

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

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

Instant.now()返回一个表示当前系统时间的Instant。使用getEpochSecond()从Instant获取纪元秒(unix时间)。

避免使用/ System.currentTimeMillis()创建Date对象。除以1000就是Unix纪元。

正如注释中提到的,对于unixTime变量的类型,通常需要一个原语long(小写字母l long)而不是一个盒装对象long(大写字母l long)。

long unixTime = System.currentTimeMillis() / 1000L;