我想知道是否有使用新的方式自1970年1月1日(时期),以获得当前毫秒LocalDate
, LocalTime
或LocalDateTime
的Java 8类。
已知的方法是如下:
long currentMilliseconds = new Date().getTime();
要么
long currentMilliseconds = System.currentTimeMillis();
我想知道是否有使用新的方式自1970年1月1日(时期),以获得当前毫秒LocalDate
, LocalTime
或LocalDateTime
的Java 8类。
已知的方法是如下:
long currentMilliseconds = new Date().getTime();
要么
long currentMilliseconds = System.currentTimeMillis();
我不完全知道你所说的“当前毫秒”的意思,但我会认为这是因为“时代”,即午夜,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();
我做什么,所以我不指定一个时区,
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()
为避免你了zoneid可以做:
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()
例如,呼叫
final long currentTimeJava8 = Instant.now().toEpochMilli();
为您提供了相同的结果。
final long currentTimeJava1 = System.currentTimeMillis();
要获得以毫秒为单位的当前时间(从epoch),使用System.currentTimeMillis()
您可以使用java.sql.Timestamp
也得到毫秒。
LocalDateTime now = LocalDateTime.now();
long milliSeconds = Timestamp.valueOf(now).getTime();
System.out.println("MilliSeconds: "+milliSeconds);
谢谢!
如果你有一个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);
}
这有助于与断言日期和时间没法比测试。