LocalDate 및 LocalDateTime에서 Epoch를 추출하는 방법은 무엇입니까?
또는 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
로컬 datetime 값 입니다 "04.02.2014 19:51:01"
. 내 시간대는 Europe/Oslo
일광 절약 시간제 UTC + 1입니다.
클래스 LocalDate
와 LocalDateTime
에 대한 정보는 포함하지 않는 시간대 또는 오프셋 시간을 시대 이후, 초는이 정보가없는 ambigious 될 것이다. 그러나 객체에는 ZoneId
인스턴스 를 전달하여 시간대가있는 날짜 / 시간 객체로 변환하는 여러 메서드가 있습니다 .
LocalDate
LocalDate date = ...;
ZoneId zoneId = ZoneId.systemDefault(); // or: ZoneId.of("Europe/Oslo");
long epoch = date.atStartOfDay(zoneId).toEpochSecond();
LocalDateTime
LocalDateTime time = ...;
ZoneId zoneId = ZoneId.systemDefault(); // or: ZoneId.of("Europe/Oslo");
long epoch = time.atZone(zoneId).toEpochSecond();
'Millis since unix epoch'는 순간을 나타내므로 Instant 클래스를 사용해야합니다.
private long toEpochMilli(LocalDateTime localDateTime)
{
return localDateTime.atZone(ZoneId.systemDefault())
.toInstant().toEpochMilli();
}
필요한 변환에는 UTC / Greewich의 오프셋 또는 시간대가 필요합니다.
오프셋이있는 경우이 작업 에 대한 전용 방법LocalDateTime
이 있습니다.
long epochSec = localDateTime.toEpochSecond(zoneOffset);
a 만 있으면 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
INSTANT_SECONDS 필드는 물론 LocalDateTime
절대 (전역) 타임 스탬프를 참조 할 수 없기 때문에 지원 되지 않습니다. 그러나 유용한 것은 1970-01-01 이후 경과 된 일수를 계산하는 EPOCH_DAY 필드 입니다. 유사한 생각이 유형에 대해 유효합니다 LocalDate
(더 적은 지원 필드 포함).
If you intend to get the non-existing millis-since-unix-epoch field you also need the timezone for converting from a local to a global type. This conversion can be done much simpler, see other SO-posts.
Coming back to your question and the numbers in your code:
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 = 1391543461 seconds since 1970-01-01T00:00:00 (attention, no timezone) Then you can subtract the timezone offset (watch out for possible multiplication by 1000 if in milliseconds).
UPDATE after given timezone info:
local time = 1391543461 secs
offset = 3600 secs (Europe/Oslo, winter time in february)
utc = 1391543461 - 3600 = 1391539861
As JSR-310-code with two equivalent approaches:
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();
Convert from human readable date to epoch:
long epoch = new java.text.SimpleDateFormat("MM/dd/yyyyHH:mm:ss").parse("01/01/1970 01:00:00").getTime() / 1000;
Convert from epoch to human readable date:
String date = new java.text.SimpleDateFormat("MM/dd/yyyyHH:mm:ss").format(new java.util.Date (epoch*1000));
For other language converter: https://www.epochconverter.com
참고URL : https://stackoverflow.com/questions/22990067/how-to-extract-epoch-from-localdate-and-localdatetime
'Program Tip' 카테고리의 다른 글
strtr과 str_replace를 언제 사용합니까? (0) | 2020.10.07 |
---|---|
vi / vim에서 돌아 가기 (ctrl + z) 방법 (0) | 2020.10.07 |
JPA (및 해당 조인 테이블 행)에서 ManyToMany 관계가있는 엔티티를 제거하는 방법은 무엇입니까? (0) | 2020.10.07 |
Safari의 iPad WebApp 전체 화면 (0) | 2020.10.07 |
정규식 및 역 참조로 Ruby switch 문 (case… when)을 작성하는 방법은 무엇입니까? (0) | 2020.10.07 |