378

I am wondering if there is a way to get current milliseconds since 1-1-1970 (epoch) using the new LocalDate, LocalTime or LocalDateTime classes of Java 8.

The known way is below:

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

or

long currentMilliseconds = System.currentTimeMillis();
4

14 回答 14

409

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

如果您想找到从现在System.currentTimeMillis()开始的毫秒数,请按照Anubian Noob 指出的那样使用。如果是这样,就没有理由使用任何新的 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"));

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

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

long millis = zdt.toInstant().toEpochMilli();
于 2014-05-30T01:46:55.997 回答
124

我这样做是为了不指定时区,

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

ldt 1424812121078 
ctm 1424812121281

如您所见,除了执行时间较短外,这些数字是相同的。

万一您不喜欢 System.currentTimeMillis,请使用Instant.now().toEpochMilli()

于 2015-02-24T21:12:08.947 回答
25

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

例如调用

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

给你同样的结果

final long currentTimeJava1 = System.currentTimeMillis();
于 2018-02-12T09:24:23.980 回答
24

为了避免 ZoneId 你可以这样做:

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

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

取 0 作为值,没错!

于 2015-05-13T16:00:49.123 回答
16

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

LocalDateTime now = LocalDateTime.now();
long milliSeconds = Timestamp.valueOf(now).getTime();
System.out.println("MilliSeconds: "+milliSeconds);
于 2018-06-29T09:08:24.020 回答
11

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

于 2014-05-29T23:01:10.807 回答
9

你可以试试这个:

long diff = LocalDateTime.now().atZone(ZoneOffset.UTC).toInstant().toEpochMilli();
于 2020-12-15T10:42:31.460 回答
4

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

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

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

于 2020-03-17T23:33:04.760 回答
3

如果您有 Java 8 时钟,则可以使用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);
}

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

于 2018-07-18T09:04:59.817 回答
3

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

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();
于 2021-02-21T18:34:00.403 回答
2
  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();
}
于 2019-08-25T16:04:57.397 回答
1

对于 LocalDateTime 我这样做:

LocalDateTime.of(2021,3,18,7,17,24,341000000)
    .toInstant(OffsetDateTime.now().getOffset())
    .toEpochMilli()
于 2021-03-18T09:21:27.537 回答
1

我认为这更简单:

ZonedDateTime zdt = ZonedDateTime.of(LocalDateTime.now(), ZoneId.systemDefault());
Assert.assertEquals(System.currentTimeMillis(), zdt.toInstant().toEpochMilli());

获取像 System.currentTimeMillis() 一样的毫秒(来自 UTC)。

于 2021-08-13T10:21:25.647 回答
0

有一些可用的方法在这里没有人提到。但我看不出他们不应该工作的原因。

的情况下LocalDate,您可以使用该toEpochDay()方法。它返回自 1970 年 1 月 1 日以来的天数。然后该数字可以轻松转换为毫秒:

long dateInMillis = TimeUnit.DAYS.toMillis(myLocalDate.toEpochDays());

文档可以在这里找到。

的情况下LocalDateTime,您可以使用该toEpochSecond()方法。它返回自 1970 年 1 月 1 日以来的秒数。然后该数字也可以转换为毫秒:

long dateTimeInMillis = TimeUnit.SECONDS.toMillis(myLocalDateTime.toEpochSeconds());

文档在这里

于 2022-02-03T20:13:47.143 回答