tl; dr
Instant.ofEpochMilli( 1_317_816_735_000L )
.atZone( ZoneId.of( "Pacific/Auckland" ) )
.format( DateTimeFormatter.ofLocalizedDateTime( FormatStyle.MEDIUM ).withLocale( new Locale( "en" , "NZ" ) ) )
…또한…
LocalDateTime.parse( "2011-10-06 03:35:05".replace( " " , "T" ) )
.atZone( ZoneId.of( "Pacific/Auckland" ) )
java.time
질문과 대부분의 답변은 초기 Java 버전의 오래된 레거시 날짜-시간 클래스를 사용합니다. 이러한 오래된 수업은 번거롭고 혼란스러운 것으로 입증되었습니다. 그들을 피하십시오. 대신 java.time 클래스를 사용하십시오.
ISO 8601
입력 문자열은 거의 표준 ISO 8601 형식입니다. 중간의 SPACE를 T
.
String input = "2011-10-06 03:35:05".replace( " " , "T" );
LocalDateTime
LocalDateTime
입력에 UTC 또는 시간대에 대한 정보가 없기 때문에 이제 a로 구문 분석 하십시오. A LocalDateTime
에는 오프셋이나 시간대에 대한 개념이 없으므로 타임 라인의 실제 순간을 않습니다 .
LocalDateTime ldt = LocalDateTime.parse( input );
ZoneOffset
비즈니스 컨텍스트에서이 문자열의 의도는 UTC보다 13 시간 앞선 순간을 나타내는 것임을 알고있는 것 같습니다. 그래서 우리는ZoneOffset
.
ZoneOffset offset = ZoneOffset.ofHours( 13 );
OffsetDateTime
그것을 얻기 위하여 그것을 적용하십시오 OffsetDateTime
개체 . 이것은 타임 라인의 실제 순간이됩니다.
OffsetDateTime odt = ldt.atOffset( offset);
ZoneId
하지만 당신은 뉴질랜드를 언급합니다. 따라서 특정 시간대를 염두에 두었습니다. 시간대는 UTC로부터의 오프셋입니다. 플러스 같은 일광 절약 시간 (DST)과 같은 이상을 처리하기위한 규칙들의 집합. 따라서 우리는 단순한 오프셋 ZoneId
이 ZonedDateTime
아닌 a 를 지정할 수 있습니다 .
적절한 시간대 이름을 지정하십시오 . EST
또는 IST
과 같은 3-4 자의 약어를 사용하지 마십시오. 표준 시간대가 아니고 고유하지도 않습니다 (!). 예를 들면Pacific/Auckland
.
ZoneId z = ZoneId.of( "Pacific/Auckland" );
ZonedDateTime
적용 ZoneId
.
ZonedDateTime zdt = ldt.atZone( z );
타임 라인에서 같은 순간에 다른 영역으로 쉽게 조정할 수 있습니다.
ZoneId zParis = ZoneId.of( "Europe/Paris" );
ZonedDateTime zdtParis = zdt.withZoneSameInstant( zParis );
시대부터 계산
1970 UTC가 시작된 후의 밀리 초와 같은 epoch의 카운트로 날짜-시간 값을 처리하지 않는 것이 좋습니다. 하지만 필요한 경우Instant
이러한 번호에서 .
Instant instant = Instant.ofEpochMilli( 1_317_816_735_000L );
그런 다음 원하는 경우 위에 표시된대로 시간대를 지정하여 UTC에서 벗어나십시오.
ZoneId z = ZoneId.of( "Pacific/Auckland" );
ZonedDateTime zdt = instant.atZone( z );
귀하의 가치 1_317_816_735_000L
는 다음과 같습니다.
2011-10-05T12:12:15Z
(2011 년 10 월 5 일 수요일 12:12:15 GMT)
2011-10-06T01:12:15+13:00[Pacific/Auckland]
(2011 년 10 월 6 일 목요일 뉴질랜드 오클랜드에서 01:12:15).
문자열 생성
표준 ISO 8601 형식으로 문자열을 생성하려면 toString
. ZonedDateTime
시간대 이름을 대괄호로 묶어 표준 형식 을 현명하게 확장합니다.
String output = zdt.toString();
다른 형식의 경우 Stack Overflow에서 DateTimeFormatter
클래스를 검색하십시오 . 이미 여러 번 다루었습니다.
a FormatStyle
및 Locale
.
Locale l = new Locale( "en" , "NZ" );
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.MEDIUM ).withLocale( l );
String output = zdt.format( f );
시간대는 로케일과 관련 이 없습니다 . 당신은 할 수 있습니다 Europe/Paris
날짜와 시간이 일본어 및 문화적 규범, 또는 표시 Asia/Kolkata
포르투갈어, 브라질 문화적 규범에 표시되는 날짜 - 시간.
java.time 정보
java.time의 프레임 워크는 나중에 자바 8에 내장되어 있습니다. 이러한 클래스는 같은 귀찮은 된 날짜 - 시간의 수업을 대신하는 java.util.Date
, .Calendar
, java.text.SimpleDateFormat
.
Joda 타임 지금 프로젝트, 유지 관리 모드 , java.time로 마이그레이션을 조언한다.
자세한 내용은 Oracle Tutorial을 참조하십시오 . 그리고 많은 예제와 설명을 위해 Stack Overflow를 검색하십시오.
많은 java.time 기능은 자바 6 & 7 백 포팅 ThreeTen - 백 포트 추가에 적응 안드로이드 에 ThreeTenABP (참조 ... 사용 방법 ).
ThreeTen - 추가 프로젝트 추가 클래스와 java.time를 확장합니다. 이 프로젝트는 java.time에 향후 추가 될 수있는 가능성을 입증하는 근거입니다. 여기 Interval
에서 YearWeek
,, 등과 같은 유용한 클래스를 찾을 수 있습니다 YearQuarter
.