[java] Java 8의 LocalDateTime에서 밀리 초를 얻는 방법

상기 새를 사용 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);
}

날짜와 시간을 측정 할 수없는 테스트에 도움이됩니다.