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


323

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

예:

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


5
@marcolopes주의해서 사용하는 private static SimpleDateFormat것은 스레드로부터 안전하지 않습니다.
vegemite4me


이 다른 Question 과 유사 하지만이 질문은 전체 초로 자르지 만이 질문은 전체 분으로 자릅니다.
Basil Bourque

답변:


292

원하는 객체 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()상술 한 바와 같이하여 현재 시간을 포맷한다.


8
@Joachim이 "표준"접근 방식의 단점 "yyyy-MM-dd'T'HH:mmZ"은 ISO-8601 형식의 날짜가 필요할 때마다 응용 프로그램에 많은 인스턴스가 있어야한다는 것 입니다. 내가 본 것처럼 JodaTime을 사용하면 미리 정의 된 포맷터를 사용할 수 있습니다. ISODateTimeFormat이 기능은 저에게 도움이됩니다.
yegor256

8
@Joachim Z은 SimpleDateFormat에서 유효한 패턴입니다 yyyy-MM-dd'T'HH:mm'Z'.
Buhake Sindi

33
-1 UTC가 아닌 현재 시간대의 날짜 / 시간을 제공합니다. Carlos의 답변에는 필요한 UTC 코드가 포함되어 있습니다.
Scott Rippey

16
나는 시간대 실수를 고쳤습니다-그것이 받아 들인 대답이기 때문에 그것이 옳은 일이라고 생각합니다.
BoD

2
Z는 "yyyy-MM-dd'T'HH : mm'Z '"로 인용해야합니다.
Kimball Robinson

224

기본 시간대가 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에 의해 수정 됨)


9
이 형식은 일부 내장 라이브러리에서 일정하지 않습니까?
Daniel Kaplan

'DateFormat'에는 두 가지 패키지가 있습니다. 'import java.text.DateFormat'을 사용해야합니다.
oabarca

3
현재 시간대를 원하면 TimeZone을 사용하십시오. tz = TimeZone.getDefault (); 대신
oabarca

'Z'를 형식적으로 인용하면 논리적으로 중요하지 않기 때문에 인용 해서는 안됩니다 . 위의 예에서와 같이 TimeZone이 UTC 인 경우 인용되지 않은 Z는 출력에서 ​​Z 만 발생하지만 TimeZone이 UTC가 아닌 경우 시간이 아닐 때 Z는 UTC를 암시하는 문자 그대로 출력됩니다. 있다. 소비 시스템이 Z를 UTC로 읽지 만 시간이 아닌 경우 시간이 변경됩니다. 반대로 파서가 TimeZone을 설정하지 않고 따옴표로 묶인 Z를 사용하는 경우 UTC 시간을 현지 시간으로 다시 구문 분석합니다 (이동). 이 인용문은 TZ가 설정되어 있으면 필요하지 않지만 설정되어 있지 않으면 위험합니다.
매트 위플

@MattWhipple -하지만 당신은 인용 부호로 둘러싸 Z를 사용하면 결과가있을 것 같은 2016-06-14T13:56+0000- 질문 같은 것을 요구한다2016-06-14T13:56Z
user85421

184

자바 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의 저자에 의해 설계되었다는 것을 고려하십시오.


9
좋은 대답입니다. JVM의 현재 기본 시간대에 내재적으로 의존하지 않고 시간대 를 명시 적으로 지정하는 것이 좋습니다. 원하는 경우 특정 시간대를 지정할 수 있습니다 ( 예 :) ZoneId.of( "America/Montreal" ).
Basil Bourque

1
Instant에서는 .toString () 메서드를 호출하여 ISO 8601 형식으로 return DateTimeFormatter.ISO_INSTANT.format(this);
서식을 지정할 수 있습니다

기본값을 피하기 때문에 이것이 가장 좋습니다.
Christophe Roussy

6
경고 : ISO_INSTANT를 사용하는 Java 8 솔루션에는 성가신 단점이 있습니다. 밀리 초가 0이되면 출력에 포함되지 않습니다. 이것은 ISO 8601 표준에 따라 허용되지만 다른 언어의 많은 라이브러리 및 파서는 그렇게 용서하지 않습니다. 항상 0을 포함해야하는 경우 대신 이것을 사용하십시오. DateTimeFormatter ISO_8601 = ofPattern ( "yyyy-MM-dd'T'HH : mm : ss.SSSX"). withZone (UTC);
jurgen

11 자바 (8)로 전환 후, 나는 볼 DateTimeFormatter.ISO_INSTANTDateTimeFormatter.ISO_DATE_TIME더 이상 봄의에 의해 선택되는 3, 반대로, 초 이후 6 자리를 사용 @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME).
DanielM

126

자바 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"로 형식화되었습니다.


26
글쎄, 프로젝트에 대한 의존성으로 추가 타사 라이브러리를 포함시키고 (최신 상태로 유지하고 응용 프로그램과 함께 제공 할 수 있습니다. 추가 3.2 메가 바이트에 불과합니다) DateTime dt = new DateTime(); DateTimeFormatter fmt = ISODateTimeFormat.dateTime(); String str = fmt.print(dt);또는 캡슐화합니다 언제 어디서나 return String.format("%tFT%<tRZ", new Date());수업 str = Iso8601Time.now()에 참여할 수 있습니다. (ISO 형식이 변경되는 것은 아닙니다.) ISO 형식의 현재 날짜보다 더 필요한 것이 있으면 lib를 사용하십시오.
aioobe

2
이것에 전적으로 동의합니다.
yegor256

3
허용 된 것으로 표시되는 답변을 변경할 수 있습니다. ;-)
aioobe

8
%tFT%<tTZ초를 포함합니다; %tFT%<tTZ.%<tL밀리 초가 포함됩니다.
Patrick Linskey 1

2
매우 깔끔한 해결책은 지금까지 받아 들여질 것입니다 :)
AbdelHady

94

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

Instant.now().toString();

로부터 java.time.Instant문서 :

지금

public static Instant now()

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

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

 


public String toString()

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

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


11
이것이 정답이며,이 모든 것들에 대해 높게 평가되지 않은 스캔들입니다 SimpleDateFormats.
David Moles

더 많은 답변을 읽어서 다행입니다. 나는 이것이 지금 대답이되어야한다는 것에 동의한다.
Xan-Kun Clark-Davis

그리고이므로 toString많은 경우 명시 적으로 호출하지 않아도됩니다.
kaya3

1
이전 답변에 대한 주석의 경고도 여기에 적용됩니다. "경고 : ISO_INSTANT를 사용하는 Java 8 솔루션에는 성가신 단점이 있습니다. 밀리 초가 0이면 출력에 포함되지 않습니다. ISO 8601에 따라 허용됩니다. 표준이지만 다른 언어로 된 많은 라이브러리와 파서는 그렇게 용서하지 않습니다. "
Dave L.

27

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());

3
그리고 질문에 표시된 것처럼 형식화 된 문자열을 어떻게 생성합니까?
Joachim Sauer

4
나는 이것과 같은 간단한 것에 대한 라이브러리 의존성을 추가하지 말라고 말하고있다 (이것은 자바 코드의 두 줄로 달성 될 수있다). (물론 요구 사항이 커지면 또 다른 이야기입니다.)
aioobe

1
@aioobe는 앱의 여러 부분에서 방금 사용 된 경우 기본값으로 이동하면 괜찮습니다. 휴식 경우 jodatime이 더 좋습니다.
Jigar Joshi

5
@aioobe jodatime은 ISODateTimeFormatISO-8601의 미리 정의 된 포맷터를 가지고 있기 때문에 어떤 경우에도 좋습니다 .
yegor256

3
@ org.life.java : Jode time으로 올바르게 전환 할 수있을 때만 관련이 있습니다. Joda 시간 의이 기능 만 사용하면 그것들이 없습니다.
Joachim Sauer

20

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


3
보다 정확하게는 UTC의 현재 순간 : DateFormatUtils.format(new Date(), "yyyy-MM-dd'T'HH:mm'Z'", TimeZone.getTimeZone("UTC"));기본 시간대의 현재 순간 : DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT.format(new Date()); @ yegor256을 언급 해 주셔서 감사 DateFormatUtils합니다.
babinik

19

Jodatime을 포함시키지 않으려는 경우 (있는 그대로)

javax.xml.bind.DatatypeConverter.printDateTime(
    Calendar.getInstance(TimeZone.getTimeZone("UTC"))
);

다음과 같은 문자열을 반환합니다.

2012-07-10T16:02:48.440Z

원래 요청과 약간 다르지만 여전히 ISO-8601입니다.



10

조다 타임

업데이트 : Joda 타임 프로젝트에 지금 유지 관리 모드 받는 마이그레이션을 조언 팀과 함께, java.time의 클래스. 자바 6 및 7의 경우, 참조 ThreeTen - 백 포트의 추가로 안드로이드에 맞게 프로젝트, ThreeTenABP의 프로젝트를.

은 Using Joda 타임 라이브러리를 ...

String output = new DateTime( DateTimeZone.UTC ).toString() ;

이것은 스레드로부터 안전합니다. Joda-Time은 기존 객체를 변경하지 않고 새로운 불변 객체를 만듭니다 .

몇 초 만에 몇 초 만에 포맷을 요청하려는 경우 Joda-Time의 다른 많은 내장 포맷터 중 하나를 사용하십시오.

DateTime now = new DateTime( DateTimeZone.UTC ) ;
String output = ISODateTimeFormat.dateHourMinute.print( now ) ;

java.time

Java 8 이상의 경우 Joda-Time이 계속 작동합니다. 그러나 내장 java.time 프레임 워크는 Joda-Time을 대체합니다. 따라서 가능한 빨리 코드를 Joda-Time에서 java.time으로 마이그레이션하십시오.

현대적인 솔루션에 대한 다른 답변 을 참조하십시오 .


java.time에 대하여

java.time의 프레임 워크는 나중에 자바 8에 내장되어 있습니다. 이 클래스는 까다로운 기존에 대신 기존 과 같은 날짜 - 시간의 수업을 java.util.Date, Calendar, SimpleDateFormat.

Joda 타임 프로젝트는 지금에 유지 관리 모드 의로 마이그레이션을 조언 java.time의 클래스.

자세한 내용은 Oracle Tutorial을 참조하십시오 . 많은 예제와 설명을 보려면 스택 오버플로를 검색하십시오. 사양은 JSR 310 입니다.

java.time 객체를 데이터베이스와 직접 교환 할 수 있습니다 . JDBC 4.2 이상을 준수 하는 JDBC 드라이버를 사용하십시오 . 문자열이 필요없고 수업이 필요 없습니다 .java.sql.*

java.time 클래스는 어디서 구할 수 있습니까?

ThreeTen - 추가 프로젝트 추가 클래스와 java.time를 확장합니다. 이 프로젝트는 향후 java.time에 추가 될 수있는 입증 된 근거입니다. 당신은 여기에 몇 가지 유용한 클래스와 같은 찾을 수 있습니다 Interval, YearWeek, YearQuarter, 그리고 .


7

Java 버전 7의 경우

http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html Oracle 설명서를 따를 수 있습니다.

X-ISO 8601 시간대에 사용

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

System.out.println(nowAsISO);

DateFormat df1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX");
//nowAsISO = "2013-05-31T00:00:00Z";
Date finalResult = df1.parse(nowAsISO);

System.out.println(finalResult);

5

ISO 8601에 대해 다음 패턴으로 Java의 SimpleDateFormat 을 사용할 수 있습니다 yyyy-MM-dd'T'HH:mm:ssXXX.

샘플 코드 : (사용 가능한 모든 시간대 목록)

for (String timeZone : TimeZone.getAvailableIDs())
{
    DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");
    dateFormat.setTimeZone(TimeZone.getTimeZone(timeZone));
    String formatted = dateFormat.format(new Date());
    System.out.print(formatted);

    if (formatted.endsWith("Z"))
    {
        // These time zone's have offset of '0' from GMT.
        System.out.print("\t(" + timeZone + ")");
    }

    System.out.println();
}

당신은 사용할 수 있습니다 :

TimeZone.getDefault ()

기본 vm 시간대의 경우 여기

로 끝나는 일부 시간대의 날짜 시간이 표시 될 수 있습니다 'Z'. 이 시간대는 '0'GMT와 오프셋이 있습니다.

자세한 내용은 여기를 참조하십시오 .


5

가장 쉬운 방법은 먼저 인스턴트로 이동 한 다음 다음과 같이 문자열로 만드는 것입니다.

String d = new Date().toInstant().toString();

결과는 다음과 같습니다.

2017-09-08T12:56:45.331Z


4
현재 시간을 원한다면 구식 Date개체 를 거치지 않아도됩니다 . 그냥하세요 Instant.now().toString(). Date레거시 API에서 얻은 것이 있으면 가장 좋은 방법입니다.
Ole VV

올레 VV 같은, 귀찮은 된 날짜 - 시간의 수업을 주석으로 java.util.Date, java.util.Calendar그리고 java.text.SimpleDateFormat지금 기존 에 의해 대체, java.time의 나중에 자바 8에 내장 된 클래스. Oracle의 Tutorial 참조하십시오 .
Basil Bourque

5

tl; dr

다른 답변 중 일부는 java.time 클래스 를 추천하는 것은 정확 하지만 특정 요구에 불필요한 길이를 사용합니다.

Instant.now()                               // Capture the current moment in UTC with a resolution as fines nanoseconds but usually in microseconds or milliseconds.
       .truncatedTo( ChronoUnit.MINUTES )   // Lop off any seconds or fractional second, to get a value in whole minutes.
       .toString()                          // Generate a String in standard ISO 8601 format where a `T` separates the year-month-day from the hour-minute-second, and the `Z` on the end for “Zulu” means UTC.

2018-01-23T12 : 34Z

Instant::toString

jav.time.Instant클래스는 항상 UTC에, UTC의 순간을 나타냅니다.

Instant instant = Instant.now() ;

instant.toString () : 2018-01-23T12 : 34 : 56.123456Z

Z귀하의 예제 문자열의 끝은 2010-10-12T08:50Z"줄루어"발음과 의미한다 UTC를 .

원하는 형식이 ISO 8601 표준 을 준수 합니다. java.time의 문자열을 생성 / 분석 할 때 클래스는 기본적으로 이러한 표준 형식을 사용합니다. 따라서 서식 패턴을 지정할 필요가 없습니다. Instant::toString위와 같이 전화하십시오 .

구체적으로 초 또는 초 단위가 아닌 전체 분을 원하면 자릅니다. ChronoUnit수업을 통해 시간 단위를 지정하십시오 .

Instant instant = Instant.now().truncatedTo( ChronoUnit.MINUTES ) ;
String output = instant.toString();  // Generate a `String` object in standard ISO 8601 format.

java.time에 대하여

java.time의 프레임 워크는 나중에 자바 8에 내장되어 있습니다. 이 클래스는 까다로운 기존에 대신 기존 과 같은 날짜 - 시간의 수업을 java.util.Date, Calendar, SimpleDateFormat.

Joda 타임 프로젝트는 지금에 유지 관리 모드 의로 마이그레이션을 조언 java.time의 클래스.

자세한 내용은 Oracle Tutorial을 참조하십시오 . 많은 예제와 설명을 보려면 스택 오버플로를 검색하십시오. 사양은 JSR 310 입니다.

java.time 객체를 데이터베이스와 직접 교환 할 수 있습니다 . JDBC 4.2 이상을 준수 하는 JDBC 드라이버를 사용하십시오 . 문자열이 필요없고 수업이 필요 없습니다 .java.sql.*

java.time 클래스는 어디서 구할 수 있습니까?

ThreeTen - 추가 프로젝트 추가 클래스와 java.time를 확장합니다. 이 프로젝트는 향후 java.time에 추가 될 수있는 입증 된 근거입니다. 당신은 여기에 몇 가지 유용한 클래스와 같은 찾을 수 있습니다 Interval, YearWeek, YearQuarter, 그리고 .


2

여기에 "now ()"를 호출하면 더 이상 할 일이 없도록 최적화 된 전체 클래스가 있습니다.

public class Iso8601Util
{
    private static TimeZone tz = TimeZone.getTimeZone("UTC");
    private static DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm'Z'");

    static
    {
        df.setTimeZone(tz);
    }

    public static String now()
    {
        return df.format(new Date());
    }
}

9
SimpleDateFormat이 스레드로부터 안전하지 않기 때문에 정적으로 만들면 문제가 발생할 수 있습니다. "날짜 형식은 동기화되지 않습니다. 각 스레드마다 별도의 형식 인스턴스를 작성하는 것이 좋습니다. 여러 스레드가 동시에 형식에 액세스하는 경우 외부에서 동기화해야합니다." docs.oracle.com/javase/7/docs/api/java/text/…
Juha Palomäki

2
@ Juha Palomäki가 언급했듯이 이것은 스레드 안전하지 않습니다. Java 8 이상을 사용하는 경우 ThreadLocal.withInitial이이 를 해결할 수 있습니다. 당신이 자바 7을 사용하거나 낮은 경우, 새의 ThreadLocal를 만들고 재정 의하여 초기 값을 제공 ThreadLocal.initialValue
user393274을

@ user393274-Java 8을 사용하는 경우 Instant, DateTimeFormat그리고 다른 최신 스레드 안전 대체 를 사용해야합니다 .

스레드 안전하지 않은 SimpleDateFormat의 문제에 약간 당황합니다. 두 개의 스레드가 정적 이니셜 라이저를 동시에 실행하면 SimpleDateFormat 생성자가 두 번 호출되는 것보다 더 나쁜 것은 없지만 마지막 순간 (마지막 한 것) 만 "df"로 기록됩니다.
gilbertpilz

2
private static String getCurrentDateIso()
{
    // Returns the current date with the same format as Javascript's new Date().toJSON(), ISO 8601
    DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.US);
    dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
    return dateFormat.format(new Date());
}

1

여전히 joda-time은 기본 형식이 아닌 "2015-12-09T00 : 22 : 42.930Z"확장 형식 만 지원합니다. "20151209T002242.930Z"... Java SimpleDateFormat을 사용하여 형식 목록을 테스트하는 것이 좋습니다.


1

Android에서 Calendar 및 SimpleDateFormat을 사용하여 수행했습니다. 다음 메소드는 "GMT"시간대가있는 캘린더를 반환합니다 (이것은 표준 시간대입니다). 그런 다음 Calendar 클래스의 setTimeZone () 메소드를 사용하여 Calendar 클래스를 사용하여 다른 시간대 사이의 시간을 설정할 수 있습니다.

private static final String GMT = "GMT";
private static final String DATE_FORMAT_ISO = "yyyyMMdd'T'HHmmss";

public static Calendar isoToCalendar(final String inputDate) {
    Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone(GMT));
    try {
        SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT_ISO, Locale.US);
        dateFormat.setTimeZone(TimeZone.getTimeZone(GMT));
        Date date = dateFormat.parse(inputDate);
        calendar.setTime(date);
    } catch (ParseException e) {
        Log.e("TAG",e.getMessage());
    }
    return calendar;
}

기억하십시오 : Date 클래스는 TimeZone 존재에 대해 알지 못합니다. 따라서 하나의 날짜를 디버깅하면 항상 현재 시간대의 날짜가 표시됩니다.


1

성능에 관심이 있다면 ISO8601 형식의 날짜를 처리 할 때 표준 Java 파서 및 포맷터보다 우수한 라이브러리 를 만들었습니다 . DatetimeProcessor 구현은 스레드로부터 안전하며 동시 맵 또는 정적 필드에 캐시 될 수 있습니다.

<dependency>
  <groupId>com.axibase</groupId>
  <artifactId>date-processor</artifactId>
  <version>1.0.3</version>
</dependency>
import com.axibase.date.DatetimeProcessor;
import com.axibase.date.PatternResolver;
import org.junit.Before;
import org.junit.Test;

import java.time.Clock;
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZoneOffset;

import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.core.Is.is;

public class DateFormatTest {
    private Clock clock;

    @Before
    public void prepare() {
        clock = Clock.fixed(Instant.ofEpochMilli(1571285405300L), ZoneId.of("Europe/Berlin"));
    }

    @Test
    public void testIsoMillis(){
        final DatetimeProcessor formatter = PatternResolver.createNewFormatter("iso");
        assertThat(formatter.print(clock.millis(), ZoneOffset.UTC), is("2019-10-17T04:10:05.300Z"));
    }

    @Test
    public void testIsoMillisLocalZone(){
        final DatetimeProcessor formatter = PatternResolver.createNewFormatter("iso");
        assertThat(formatter.print(clock.millis(), clock.getZone()), is("2019-10-17T06:10:05.300+02:00"));
    }

    @Test
    public void testIsoMinutes(){
        final DatetimeProcessor formatter = PatternResolver.createNewFormatter("yyyy-MM-ddTHH:mmXXX");
        assertThat(formatter.print(clock.millis(), ZoneOffset.UTC), is("2019-10-17T04:10Z"));
    }
}

0

Date에서 Instant로 이동하는 간단한 방법과이라는 메소드를 추가해야하는데 toISO8601, 이는 많은 사람들이 찾고있는 방법입니다. java.util.Date에서 ISO 8601 형식에 이르기까지 다른 답변을 보완합니다.

Instant.ofEpochMilli(date.getTime()).toString();

자동 완성을 사용할 때 실제로 보이지 않지만 : java.time.Instant.toString():

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


0
DateTimeFormatter.ISO_DATE_TIME
        .withZone(ZoneOffset.UTC)
        .format(yourDateObject.toInstant())

이 코드는 질문에 대답 할 수 있지만,이 코드가 질문에 응답하는 이유 및 / 또는 방법에 대한 추가 컨텍스트를 제공하면 장기적인 가치가 향상됩니다.
Vishal Chhodwani

-2

이 시도,

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSSSZ");
        String date=sdf.format (new Date() );

ISO 8601 형식


2
이것은 잘못된 시간대의 날짜를 사용합니다. Carlos의 답변을 참조하십시오.
Stian Soiland-Reyes
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.