source

LocalDate 및 LocalDateTime에서 에폭을 추출하는 방법

factcode 2022. 9. 30. 11:03
반응형

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/OsloUTC+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

반응형