如何从LocalDateTime得到毫秒的Java 8如何从LocalDateTime得到毫秒的Ja

2019-05-13 04:20发布

我想知道是否有使用新的方式自1970年1月1日(时期),以获得当前毫秒LocalDateLocalTimeLocalDateTime的Java 8类。

已知的方法是如下:

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

要么

long currentMilliseconds = System.currentTimeMillis();

Answer 1:

我不完全知道你所说的“当前毫秒”的意思,但我会认为这是因为“时代”,即午夜,1970年1月1日UTC毫秒数。

如果您现在就想找到,因为时代的毫秒数然后使用System.currentTimeMillis()为Anubian菜鸟指出 。 如果是这样,没有理由使用任何新的java.time API来做到这一点。

但是,也许你已经有了一个LocalDateTime从某处或类似物体,并且希望将其转换为毫秒,因为时代。 它不可能直接做,因为LocalDateTime家庭对象没有的他们在哪个时区的概念。因此,时区信息需要被提供给寻找与时代,这是UTC时间。

假设你有一个LocalDateTime这样的:

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

您需要应用时区信息,给人一种ZonedDateTime 。 我在同一时区洛杉矶,所以我会做这样的事情:

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

当然,这使得有关时区的假设。 并有可能发生,例如,如果本地时间恰好命名接近日光节约时间(夏令时)转变的时间边缘情况。 让我们设置这些不谈,但你应该知道存在这些情况。

无论如何,如果你能得到一个有效的ZonedDateTime ,你可以在此从纪元转换为毫秒数,像这样:

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


Answer 2:

我做什么,所以我不指定一个时区,

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

ldt 1424812121078 
ctm 1424812121281

万一你不喜欢System.current ....,使用Instant.now().toEpochMilli()



Answer 3:

为避免你了zoneid可以做:

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

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

获得0的值,这是正确的!



Answer 4:

由于Java 8,你可以调用java.time.Instant.toEpochMilli()

例如,呼叫

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

为您提供了相同的结果。

final long currentTimeJava1 = System.currentTimeMillis();


Answer 5:

要获得以毫秒为单位的当前时间(从epoch),使用System.currentTimeMillis()



Answer 6:

您可以使用java.sql.Timestamp也得到毫秒。

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

谢谢!



Answer 7:

如果你有一个Java 8个时钟,那么你可以使用clock.millis()尽管它建议您使用clock.instant()来获得一个Java 8瞬间,因为它是更准确)。

为什么你会使用Java 8个时钟? 因此,在您的DI框架,你可以创建一个时钟豆:

@Bean
public Clock getClock() {
    return Clock.systemUTC();
}

然后在你的测试,你可以很容易地模拟它:

@MockBean private Clock clock;

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

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

这有助于与断言日期和时间没法比测试。



文章来源: How to get milliseconds from LocalDateTime in Java 8