Java 8에서 LocalDateTime에서 밀리초를 얻는 방법
1-1-1970(Epoch) 이후 새로운 버전을 사용하여 현재 밀리초를 얻을 수 있는 방법이 있는지 궁금합니다.LocalDate,LocalTime또는LocalDateTimeJava 8의 클래스입니다.
알려진 방법은 다음과 같습니다.
long currentMilliseconds = new Date().getTime();
또는
long currentMilliseconds = System.currentTimeMillis();
"현재 밀리초"가 무엇을 의미하는지 정확히 알 수는 없지만, "에포치" 이후, 즉 1970년 1월 1일 자정부터의 밀리초 수라고 추측합니다.
이 에폭 이후의 시간(밀리초)을 지금 당장 찾으십시오.System.currentTimeMillis()아누비안 누브가 지적한 것처럼요이 경우 이를 위해 새로운 java.time API를 사용할 필요가 없습니다.
하지만, 아마 당신은 이미 가지고 있을 것이다.LocalDateTime또는 유사 객체를 에폭스 이후 밀리초로 변환해야 합니다.직접 할 수는 없습니다.LocalDateTime어떤 시간대에 있는지 알 수가 없어요따라서 시간대 정보를 입력하여 에폭(UTC)에 상대적인 시간을 찾아야 합니다.
예를 들어,LocalDateTime다음과 같습니다.
LocalDateTime ldt = LocalDateTime.of(2014, 5, 29, 18, 41, 16);
표준 시간대 정보를 적용해야 합니다.ZonedDateTime저는 LA와 같은 시간대이기 때문에 이렇게 하겠습니다.
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()
Java 8에서는java.time.Instant.toEpochMilli().
예를 들어 콜
final long currentTimeJava8 = Instant.now().toEpochMilli();
같은 결과를 얻을 수 있습니다.
final long currentTimeJava1 = System.currentTimeMillis();
ZoneId를 회피하려면 다음 작업을 수행합니다.
LocalDateTime date = LocalDateTime.of(1970, 1, 1, 0, 0);
System.out.println("Initial Epoch (TimeInMillis): " + date.toInstant(ZoneOffset.ofTotalSeconds(0)).toEpochMilli());
0을 값으로 받는 것은 맞습니다!
사용할 수 있습니다.java.sql.Timestamp밀리초도 얻을 수 있습니다.
LocalDateTime now = LocalDateTime.now();
long milliSeconds = Timestamp.valueOf(now).getTime();
System.out.println("MilliSeconds: "+milliSeconds);
현재 시간(에폭 이후)을 밀리초 단위로 가져오려면System.currentTimeMillis().
다음과 같이 시험해 보십시오.
long diff = LocalDateTime.now().atZone(ZoneOffset.UTC).toInstant().toEpochMilli();
왜 아무도 그 방법을 언급하지 않았지?LocalDateTime.toEpochSecond():
LocalDateTime localDateTime = ... // whatever e.g. LocalDateTime.now()
long time2epoch = localDateTime.toEpochSecond(ZoneOffset.UTC);
이것은 위의 많은 제안 답변보다 훨씬 짧은 것 같습니다.
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);
}
날짜와 시간을 헤아릴 수 없을 정도로 강조하는 테스트에 도움이 됩니다.
날짜 및 시간은 String to Long(밀리):
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();
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();
}
이게 더 간단한 것 같아요.
ZonedDateTime zdt = ZonedDateTime.of(LocalDateTime.now(), ZoneId.systemDefault());
Assert.assertEquals(System.currentTimeMillis(), zdt.toInstant().toEpochMilli());
시스템.currentTimeMillis()와 같은 millis를 가져옵니다(UTC에서).
LocalDateTime의 경우 다음과 같이 수행합니다.
LocalDateTime.of(2021,3,18,7,17,24,341000000)
.toInstant(OffsetDateTime.now().getOffset())
.toEpochMilli()
여기서 아무도 언급하지 않은 몇 가지 방법이 있습니다.하지만 나는 그들이 일을 하지 말아야 할 이유를 모르겠다.
의 LocalDate 을할 수 .toEpochDay() it 。 1970.01.01부터의 일수를 반환합니다.그러면 이 수치를 밀리초로 쉽게 변환할 수 있습니다.
long dateInMillis = TimeUnit.DAYS.toMillis(myLocalDate.toEpochDays());
메뉴얼은, 여기를 참조해 주세요.
의 LocalDateTime 을할 수 .toEpochSecond()1970.770/01/01 이후의 합니다.그러면 이 숫자도 밀리초로 변환할 수 있습니다.
long dateTimeInMillis = TimeUnit.SECONDS.toMillis(myLocalDateTime.toEpochSeconds());
그 서류는 여기 있습니다.
언급URL : https://stackoverflow.com/questions/23944370/how-to-get-milliseconds-from-localdatetime-in-java-8
'programing' 카테고리의 다른 글
| Enter 키를 누르기를 기다리지 않고 표준 입력에서 문자 캡처 (0) | 2022.07.28 |
|---|---|
| C에서 어레이를 참조로 전달하시겠습니까? (0) | 2022.07.28 |
| 마스터/상세 구성 요소에서 Ag 그리드 자동 높이 설정 (0) | 2022.07.28 |
| 인텔리J에서는 가능하지만 이클립스에서는 불가능하다고요? (0) | 2022.07.27 |
| vue 컴포넌트에서 저장 버튼을 클릭한 후 모드를 닫으려면 어떻게 해야 합니까? (0) | 2022.07.27 |