[java] 날짜, 시간 및 분을 사용하여 ISO 8601 형식으로 현재 순간을 얻는 방법은 무엇입니까?

현재 순간 (UTC)의 ISO 8601 형식 프레젠테이션 을 얻는 가장 우아한 방법은 무엇입니까 ? 다음과 같아야합니다 2010-10-12T08:50Z..

예:

String iso8601 = DateFormat.getDateTimeInstance(DateFormat.ISO_8601).format(date);



답변

원하는 객체 SimpleDateFormat를 포맷하는 데 사용하십시오 Date.

TimeZone tz = TimeZone.getTimeZone("UTC");
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm'Z'"); // Quoted "Z" to indicate UTC, no timezone offset
df.setTimeZone(tz);
String nowAsISO = df.format(new Date());

사용 a new Date()상술 한 바와 같이하여 현재 시간을 포맷한다.


답변

기본 시간대가 UTC가 아닌 시스템의 경우 :

TimeZone tz = TimeZone.getTimeZone("UTC");
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm'Z'");
df.setTimeZone(tz);
String nowAsISO = df.format(new Date());

SimpleDateFormat인스턴스가 자주 필요한 경우 글로벌 상수로 선언하지만,이 클래스는 스레드 안전하지 않습니다 것을주의 할 수있다. 여러 스레드가 동시에 액세스하는 경우 동기화되어야합니다.

편집 : 많은 다른 시간 / 날짜 조작을 수행하는 경우 Joda Time을 선호합니다 …
EDIT2 : 수정 : setTimeZone문자열을 수락하지 않습니다 (Paul에 의해 수정 됨)


답변

자바 8 네이티브

java.time 은 Java 8부터 간단합니다. 그리고 스레드 안전합니다.

ZonedDateTime.now( ZoneOffset.UTC ).format( DateTimeFormatter.ISO_INSTANT )

결과: 2015-04-14T11:07:36.639Z

당신은 가벼운 사용하도록 유혹 할 수 Temporal와 같은 InstantLocalDateTime,하지만 그들은 지원 또는 시간 영역 데이터 포맷이 부족하다. 기본적으로 만 ZonedDateTime작동합니다.

ZonedDateTimeDateTimeFormatter 옵션 / 작업을 조정하거나 연결하여 시간대정밀도 를 어느 정도 쉽게 제어 할 수 있습니다 .

ZonedDateTime.now( ZoneId.of( "Europe/Paris" ) )
             .truncatedTo( ChronoUnit.MINUTES )
             .format( DateTimeFormatter.ISO_DATE_TIME )

결과: 2015-04-14T11:07:00+01:00[Europe/Paris]

초 부분 제거와 같은 개선 된 요구 사항은 여전히 ​​사용자 지정 형식 또는 사용자 지정 사후 프로세스를 통해 제공되어야합니다.

.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME ) // 2015-04-14T11:07:00
.format( DateTimeFormatter.ISO_LOCAL_DATE ) // 2015-04-14
.format( DateTimeFormatter.ISO_LOCAL_TIME ) // 11:07:00
.format( DateTimeFormatter.ofPattern( "yyyy-MM-dd HH:mm" ) ) // 2015-04-14 11:07

Java 6 & 7의 경우 Android 포트 가있는 ThreeTen-Backport 와 같은 java.time 의 백 포트를 고려할 수 있습니다 . 둘 다 Joda보다 가볍고 Joda의 경험 -esp에서 배웠습니다 . java.time이 Joda의 저자에 의해 설계되었다는 것을 고려하십시오.


답변

자바 8 :

thisMoment = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mmX")
                              .withZone(ZoneOffset.UTC)
                              .format(Instant.now());

프리 자바 8 :

thisMoment = String.format("%tFT%<tRZ",
                           Calendar.getInstance(TimeZone.getTimeZone("Z")));

에서 워드 프로세서 :

'R'    24 시간 제로 “% tH : % tM”으로 형식화 된 시간
'F'    ISO 8601 완료 날짜는 “% tY- % tm- % td”로 형식화되었습니다.


답변

Java 8부터 간단하게 수행 할 수 있습니다.

Instant.now().toString();

로부터 java.time.Instant문서 :

지금


public static Instant now()

시스템 시계에서 현재 순간을 얻습니다.

현재 UTC 를 얻기 위해 시스템 UTC 시계 를 쿼리합니다 .

 


public String toString()

ISO-8601 표현을 사용한이 순간의 문자열 표현.

사용 된 형식은와 동일합니다 DateTimeFormatter.ISO_INSTANT.


답변

JodaTime 사용

ISO 8601 캘린더 시스템은 Joda-Time의 기본 구현입니다.

JodaTime Formatter에 대한 문서는 다음과 같습니다.

편집하다:

추가하고 싶지 않거나 위의 라이브러리 추가 가치가 표시되지 않으면 내장 SimpleDateFormat클래스에서 날짜를 필수 ISO 형식으로 형식화 할 수 있습니다

@Joachim Sauer가 제안한대로

DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mmZ");
String nowAsString = df.format(new Date());


답변

Apache의 DateFormatUtilscommons-lang3 에는 다음과 같은 유용한 상수가 있습니다.DateFormatUtils.ISO_DATETIME_FORMAT