关于datetime:如何从Java 8中的LocalDateTime获取毫秒数

How to get milliseconds from LocalDateTime in Java 8

我想知道是否有一种方法可以使用Java 8的新LocalDateLocalTimeLocalDateTime类获得自1-1-1970(epoch)以来的当前毫秒数。

已知的方法如下:

1
long currentMilliseconds = new Date().getTime();

要么

1
long currentMilliseconds = System.currentTimeMillis();


我不完全确定你的"当前毫秒"是什么意思,但我认为它是自"世纪"以来的毫秒数,即1970年1月1日午夜。

如果你想现在找到自纪元以来的毫秒数,那么就像Anubian Noob指出的那样使用System.currentTimeMillis()。如果是这样,没有理由使用任何新的java.time API来执行此操作。

但是,也许您已经从某个地方获得了LocalDateTime或类似的对象,并且您希望将其转换为自纪元以来的毫秒数。直接执行此操作是不可能的,因为LocalDateTime对象系列没有关于它们所处的时区的概念。因此需要提供时区信息以查找相对于以UTC为单位的时期的时间。

假设你有一个像这样的LocalDateTime

1
LocalDateTime ldt = LocalDateTime.of(2014, 5, 29, 18, 41, 16);

您需要应用时区信息,并提供ZonedDateTime。我和洛杉矶在同一时区,所以我会这样做:

1
ZonedDateTime zdt = ldt.atZone(ZoneId.of("America/Los_Angeles"));

当然,这会对时区做出假设。并且存在可能发生的边缘情况,例如,如果本地时间恰好命名接近夏令时(夏令时)转换的时间。让我们把这些放在一边,但你应该知道存在这些情况。

无论如何,如果你能得到一个有效的ZonedDateTime,你可以将它转换为自纪元以来的毫秒数,如下所示:

1
long millis = zdt.toInstant().toEpochMilli();


我这样做我没有指定时区是,

1
2
System.out.println("ldt" + LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
System.out.println("ctm" + System.currentTimeMillis());

1
2
ldt 1424812121078
ctm 1424812121281

如果您不喜欢System.current ....,请使用Instant.now().toEpochMilli()


要避免使用ZoneId,您可以:

1
2
3
LocalDateTime date = LocalDateTime.of(1970, 1, 1, 0, 0);

System.out.println("Initial Epoch (TimeInMillis):" + date.toInstant(ZoneOffset.ofTotalSeconds(0)).toEpochMilli());

获得0作为价值,这是正确的!


从Java 8开始,您可以调用java.time.Instant.toEpochMilli()

例如电话

1
final long currentTimeJava8 = Instant.now().toEpochMilli();

给你相同的结果

1
final long currentTimeJava1 = System.currentTimeMillis();


你也可以使用java.sql.Timestamp来获得毫秒。

1
2
3
LocalDateTime now = LocalDateTime.now();
long milliSeconds = Timestamp.valueOf(now).getTime();
System.out.println("MilliSeconds:"+milliSeconds);

谢谢!


要以毫秒(从纪元开始)获取当前时间,请使用System.currentTimeMillis()


如果您有Java 8 Clock,那么您可以使用clock.millis()(尽管它建议您使用clock.instant()来获取Java 8 Instant,因为它更准确)。

你为什么要使用Java 8时钟?所以在您的DI框架中,您可以创建一个Clock bean:

1
2
3
4
@Bean
public Clock getClock() {
    return Clock.systemUTC();
}

然后在你的测试中你可以轻松模拟它:

1
@MockBean private Clock clock;

或者你可以拥有一个不同的bean:

1
2
3
4
@Bean
public Clock getClock() {
    return Clock.fixed(instant, zone);
}

这有助于测试断言日期和时间无法估量。