LocalDate 및 LocalDateTime에서 에폭을 추출하는 방법
에폭 값을 추출하려면 어떻게 해야 합니까?Long
의 예로부터LocalDateTime
또는LocalDate
? 다음을 시도했지만 다른 결과가 나왔습니다.
LocalDateTime time = LocalDateTime.parse("04.02.2014 19:51:01", DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss"));
System.out.println(time.getLong(ChronoField.SECOND_OF_DAY)); // gives 71461
System.out.println(time.getLong(ChronoField.EPOCH_DAY)); // gives 16105
내가 원하는 것은 단순한 가치이다.1391539861
로컬 날짜 동안"04.02.2014 19:51:01"
제 타임존은Europe/Oslo
UTC+1(서머타임 포함)
클래스LocalDate
그리고.LocalDateTime
시간대 또는 시간 오프셋에 대한 정보는 포함되지 않습니다.이 정보가 없으면 epoch 이후의 초수가 약해집니다.단, 오브젝트에는 타임존이 있는 날짜/시간 오브젝트로 변환하기 위한 몇 가지 방법이 있습니다.ZoneId
사례.
로컬 날짜
LocalDate date = ...;
ZoneId zoneId = ZoneId.systemDefault(); // or: ZoneId.of("Europe/Oslo");
long epoch = date.atStartOfDay(zoneId).toEpochSecond();
Local Date Time(로컬 날짜 시간)
LocalDateTime time = ...;
ZoneId zoneId = ZoneId.systemDefault(); // or: ZoneId.of("Europe/Oslo");
long epoch = time.atZone(zoneId).toEpochSecond();
'Millis since unix epoch'는 Instant를 나타내므로 Instant 클래스를 사용해야 합니다.
private long toEpochMilli(LocalDateTime localDateTime)
{
return localDateTime.atZone(ZoneId.systemDefault())
.toInstant().toEpochMilli();
}
필요한 변환에는 UTC/그리치로부터의 오프셋 또는 타임존이 필요합니다.
오프셋이 있는 경우 전용 메서드가 있습니다.LocalDateTime
이 태스크의 경우:
long epochSec = localDateTime.toEpochSecond(zoneOffset);
이밖에 없는 경우ZoneId
그 후, 그 정보를 입수할 수 있습니다.ZoneOffset
에서ZoneId
:
ZoneOffset zoneOffset = ZoneId.of("Europe/Oslo").getRules().getOffset(ldt);
그러나 다음 방법을 통해 변환을 찾을 수 있습니다.ZonedDateTime
심플화:
long epochSec = ldt.atZone(zoneId).toEpochSecond();
지원되는 필드를 확인하려면 이 방법을 확인하십시오.에 대해 알게 될 것이다.LocalDateTime
:
•NANO_OF_SECOND
•NANO_OF_DAY
•MICRO_OF_SECOND
•MICRO_OF_DAY
•MILLI_OF_SECOND
•MILLI_OF_DAY
•SECOND_OF_MINUTE
•SECOND_OF_DAY
•MINUTE_OF_HOUR
•MINUTE_OF_DAY
•HOUR_OF_AMPM
•CLOCK_HOUR_OF_AMPM
•HOUR_OF_DAY
•CLOCK_HOUR_OF_DAY
•AMPM_OF_DAY
•DAY_OF_WEEK
•ALIGNED_DAY_OF_WEEK_IN_MONTH
•ALIGNED_DAY_OF_WEEK_IN_YEAR
•DAY_OF_MONTH
•DAY_OF_YEAR
•EPOCH_DAY
•ALIGNED_WEEK_OF_MONTH
•ALIGNED_WEEK_OF_YEAR
•MONTH_OF_YEAR
•PROLEPTIC_MONTH
•YEAR_OF_ERA
•YEAR
•ERA
INSTART_SEConds 필드는 물론 지원되지 않습니다.이거는LocalDateTime
는 절대(글로벌) 타임스탬프를 참조할 수 없습니다.그러나 도움이 되는 것은 1970-01-01 이후의 경과 일수를 카운트하는 EPOH_DAY 필드입니다.비슷한 생각이 유형에 유효합니다.LocalDate
(지원되는 필드는 더 적습니다).
존재하지 않는 millis-since-unix-epoch 필드를 가져오는 경우 로컬유형에서 글로벌유형으로 변환하기 위한 타임존도 필요합니다.이 변환은 훨씬 간단하게 실시할 수 있습니다.다른 SO 포스트를 참조해 주세요.
다시 질문 및 코드 내 번호로 돌아가겠습니다.
The result 1605 is correct
=> (2014 - 1970) * 365 + 11 (leap days) + 31 (in january 2014) + 3 (in february 2014)
The result 71461 is also correct => 19 * 3600 + 51 * 60 + 1
16105L * 86400 + 71461 = 1970-01T00:00:00 이후 1391543461초(주의, 시간대 없음)다음으로 타임존 오프셋을 뺄 수 있습니다(밀리초 단위의 경우 1000의 곱셈 가능성에 주의).
지정된 시간대 정보 후 업데이트:
local time = 1391543461 secs
offset = 3600 secs (Europe/Oslo, winter time in february)
utc = 1391543461 - 3600 = 1391539861
JSR-310 코드로서, 2개의 동등한 어프로치를 사용합니다.
long secondsSinceUnixEpoch1 =
LocalDateTime.of(2014, 2, 4, 19, 51, 1).atZone(ZoneId.of("Europe/Oslo")).toEpochSecond();
long secondsSinceUnixEpoch2 =
LocalDate
.of(2014, 2, 4)
.atTime(19, 51, 1)
.atZone(ZoneId.of("Europe/Oslo"))
.toEpochSecond();
이것은 존을 사용하지 않는1가지 방법입니다.
LocalDateTime now = LocalDateTime.now();
long epoch = (now.getLong(ChronoField.EPOCH_DAY) * 86400000) + now.getLong(ChronoField.MILLI_OF_DAY);
사람이 읽을 수 있는 날짜에서 에폭으로 변환:
long epoch = new java.text.SimpleDateFormat("MM/dd/yyyyHH:mm:ss").parse("01/01/1970 01:00:00").getTime() / 1000;
에폭에서 사람이 읽을 수 있는 날짜로 변환:
String date = new java.text.SimpleDateFormat("MM/dd/yyyyHH:mm:ss").format(new java.util.Date (epoch*1000));
기타 언어 변환기: https://www.epochconverter.com
언급URL : https://stackoverflow.com/questions/22990067/how-to-extract-epoch-from-localdate-and-localdatetime
'source' 카테고리의 다른 글
예외 없이 파일이 존재하는지 확인하려면 어떻게 해야 합니까? (0) | 2022.10.03 |
---|---|
gcc 7.5.0-6ubuntu2에서gcc 8.4.0-3ubuntu2로의 런타임 대규모 퍼포먼스 저하 (0) | 2022.09.30 |
기본 MySQL JOIN 동작은 INSER 또는 OUTER 중 무엇입니까? (0) | 2022.09.30 |
숫자의 Excel과 같은 열 이름을 가져오는 알고리즘 (0) | 2022.09.30 |
Python sqlite3 API를 사용한 테이블, db 스키마, 덤프 등의 목록 (0) | 2022.09.30 |