如何从Java 8中的LocalDateTime获取毫秒数

时间:2014-05-29 22:57:58

标签: java datetime java-8 milliseconds java-time

我想知道是否有办法使用Java 8的新LocalDateLocalTimeLocalDateTime类来获得自1-1-1970(epoch)以来的当前毫秒数。< / p>

以下是已知的方式:

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

long currentMilliseconds = System.currentTimeMillis();

12 个答案:

答案 0 :(得分:265)

我不完全确定你的“当前毫秒”是什么意思,但我会假设它是自“世纪”以来的毫秒数,即UTC时间1970年1月1日午夜。

如果您想立即找到自纪元以来的毫秒数,请使用System.currentTimeMillis()作为Anubian Noob has pointed out。如果是这样,就没有理由使用任何新的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();

答案 1 :(得分:68)

我做了什么,所以我没有指定时区,

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()

答案 2 :(得分:17)

要避免使用ZoneId,您可以执行以下操作:

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

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

将0作为值,这是正确的!

答案 3 :(得分:10)

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

例如电话

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

为您提供与

相同的结果
final long currentTimeJava1 = System.currentTimeMillis();

答案 4 :(得分:7)

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

答案 5 :(得分:4)

您还可以使用java.sql.Timestamp来获取毫秒数。

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

谢谢!

答案 6 :(得分:2)

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

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

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

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

@MockBean private Clock clock;

或者您可以使用其他bean:

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

这有助于对日期和时间进行不可估量的测试。

答案 7 :(得分:0)

  default LocalDateTime getDateFromLong(long timestamp) {
    try {
        return LocalDateTime.ofInstant(Instant.ofEpochMilli(timestamp), ZoneOffset.UTC);
    } catch (DateTimeException tdException) {
      //  throw new 
    }
}

default Long getLongFromDateTime(LocalDateTime dateTime) {
    return dateTime.atOffset(ZoneOffset.UTC).toInstant().toEpochMilli();
}

答案 8 :(得分:0)

为什么没有人提到方法LocalDateTime.toEpochSecond()

LocalDateTime localDateTime = ... // whatever e.g. LocalDateTime.now()
long time2epoch = localDateTime.toEpochSecond(ZoneOffset.UTC);

这似乎比上面的许多建议答案要短...

答案 9 :(得分:0)

您可以尝试以下方法:

long diff = LocalDateTime.now().atZone(ZoneOffset.UTC).toInstant().toEpochMilli();

答案 10 :(得分:0)

日期和时间作为字符串到长(毫秒):

String dateTimeString = "2020-12-12T14:34:18.000Z";

DateTimeFormatter formatter = DateTimeFormatter
                .ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.ENGLISH);

LocalDateTime localDateTime = LocalDateTime
        .parse(dateTimeString, formatter);

Long dateTimeMillis = localDateTime
        .atZone(ZoneId.systemDefault())
        .toInstant()
        .toEpochMilli();

答案 11 :(得分:0)

对于 LocalDateTime 我这样做:

LocalDateTime.of(2021,3,18,7,17,24,341000000)
    .toInstant(OffsetDateTime.now().getOffset())
    .toEpochMilli()