tl; dr
java.time.Instant // Represent a moment as seen in UTC. Internally, a count of nanoseconds since 1970-01-01T00:00Z.
.ofEpochSecond( 1_220_227_200L ) // Pass a count of whole seconds since the same epoch reference of 1970-01-01T00:00Z.
데이터 파악
사람들은 시대 이후로 시간을 추적 할 때 다양한 정밀도를 숫자로 사용합니다 . 따라서 에포크 이후 카운트로 해석 될 일부 숫자를 얻으려면 다음을 결정해야합니다.
- 어떤 시대?
많은 epochs 날짜 가 다양한 시스템에서 사용되었습니다. 일반적으로 사용되는 POSIX / Unix 시간 은 UTC로 1970 년의 첫 번째 순간입니다. 그러나이 시대를 가정 해서는 안됩니다 .
- 무슨 정밀도? 에포크 이후로
초, 밀리 초 , 마이크로 초 또는 나노초를 말하고 있습니까?
- 어떤 시간대?
일반적으로 epoch가 UTC / GMT 시간대이므로, 즉 시간대 오프셋이 전혀 없기 때문에 카운트 입니다. 그러나 때로는 경험이 없거나 날짜 시간에 무지한 프로그래머가 참여할 때 암시 된 시간대가있을 수 있습니다.
귀하의 경우 다른 사람들이 언급했듯이 Unix 시대 이후로 몇 초가 주어진 것 같습니다. 그러나 밀리 초를 예상하는 생성자에 해당 초를 전달합니다. 따라서 해결책은 1,000을 곱하는 것입니다.
교훈:
- 수신 된 데이터의 의미를 결정하고 가정하지 마십시오.
- 문서를 읽으십시오 .
귀하의 데이터
데이터가 몇 초 안에있는 것 같습니다. 1970 년 초를 가정하고 UTC 시간대를 가정하면 1,220,227,200
2008 년 9 월 1 일의 첫 번째 순간입니다.
Joda-Time
Java와 함께 번들로 제공되는 java.util.Date 및 .Calendar 클래스는 문제가있는 것으로 악명이 높습니다. 그들을 피하십시오. 대신 Joda-Time 라이브러리 또는 Java 8에 번들로 제공되는 새로운 java.time 패키지 (Joda-Time에서 영감을 얻음)를 사용하십시오.
juDate와 달리 DateTime
Joda-Time의 a 는 자신에게 할당 된 시간대를 실제로 알고 있습니다 . 따라서 아래에 표시된 Joda-Time 2.4 코드 예제에서 먼저 기본 가정 인 UTC를 사용하여 밀리 초를 구문 분석합니다. 그런 다음 두 번째로 파리의 시간대를 조정하도록 지정합니다. 우주의 타임 라인에서 같은 순간이지만 벽시계 시간은 다릅니다 . 데모를 위해 다시 UTC로 조정합니다. 암시 적 기본값 (종종 날짜-시간 작업에서 문제의 원인)에 의존하는 것보다 원하는 / 예상 시간대를 명시 적으로 지정하는 것이 거의 항상 좋습니다.
DateTime을 생성하려면 밀리 초가 필요합니다. 따라서 초를 입력하고 천을 곱하십시오. long
32 비트 오버플로가 발생하므로 결과는 64 비트 여야합니다 int
.
long input = 1_220_227_200L; // Note the "L" appended to long integer literals.
long milliseconds = ( input * 1_000L ); // Use a "long", not the usual "int". Note the appended "L".
생성자에 밀리 초 수를 입력합니다. 이 특정 생성자는 개수가 1970 년의 Unix 신기원이라고 가정합니다. 따라서 생성 후 원하는대로 시간대를 조정합니다.
적절한 시간대 이름, 대륙 및 도시 / 지역 조합을 사용하십시오 . EST
표준화되지 않은 고유하지 않은 3 자 또는 4 자 코드를 사용하지 마십시오 .
DateTime dateTimeParis = new DateTime( milliseconds ).withZone( DateTimeZone.forID( "Europe/Paris" ) );
데모를 위해 시간대를 다시 조정하십시오.
DateTime dateTimeUtc = dateTimeParis.withZone( DateTimeZone.UTC );
DateTime dateTimeMontréal = dateTimeParis.withZone( DateTimeZone.forID( "America/Montreal" ) );
콘솔에 덤프합니다. 새로운 날이 유럽에서 시작되었지만 아직 미국에서는 시작되지 않았기 때문에 몬트리올에서 날짜가 어떻게 다른지 주목하십시오.
System.out.println( "dateTimeParis: " + dateTimeParis );
System.out.println( "dateTimeUTC: " + dateTimeUtc );
System.out.println( "dateTimeMontréal: " + dateTimeMontréal );
실행할 때.
dateTimeParis: 2008-09-01T02:00:00.000+02:00
dateTimeUTC: 2008-09-01T00:00:00.000Z
dateTimeMontréal: 2008-08-31T20:00:00.000-04:00
java.time
Joda-Time의 제작자들은 우리에게 편리한 즉시 그 대체품 인 java.time 프레임 워크로 마이그레이션 할 것을 요청했습니다 . Joda-Time은 계속해서 적극적으로 지원되지만 향후 모든 개발은 ThreeTen-Extra 프로젝트의 java.time 클래스 및 해당 확장에서 수행됩니다.
Java-time 프레임 워크는 JSR 310에 의해 정의 되고 Java 8 이상에 내장됩니다. java.time 클래스는 자바 6 & 7 백 포팅 된 ThreeTen - 백 포트의 에서 프로젝트와 안드로이드에 ThreeTenABP의 프로젝트.
An Instant
은 나노초 단위 로 UTC 타임 라인의 한 순간입니다 . 그 시대는 1970 년 UTC의 첫 번째 순간입니다.
Instant instant = Instant.ofEpochSecond( 1_220_227_200L );
정보 적용 오프셋부터 UTC를 ZoneOffset
을 얻을 OffsetDateTime
.
더 나은 방법은 알려진 경우 시간대 ZoneId
를 적용 하여 ZonedDateTime
.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );