상기 새를 사용 1970년 1월 1일 (시대)부터 현재의 밀리 초를 얻을 수있는 방법이 있는지 궁금 LocalDate
, LocalTime
또는 LocalDateTime
자바 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.currentTimeMillis를 좋아하지 않는 경우를 대비하여 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();
답변
java.sql.Timestamp
밀리 초를 얻기 위해 사용할 수도 있습니다 .
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을 생성 할 수 있습니다 :
@Bean
public Clock getClock() {
return Clock.systemUTC();
}
그런 다음 테스트에서 쉽게 조롱 할 수 있습니다.
@MockBean private Clock clock;
또는 다른 콩을 가질 수 있습니다 :
@Bean
public Clock getClock() {
return Clock.fixed(instant, zone);
}
날짜와 시간을 측정 할 수없는 테스트에 도움이됩니다.