source

이 날짜 형식은 무엇입니까?2011-08-12T20:17:46.384Z

factcode 2022. 8. 20. 18:36
반응형

이 날짜 형식은 무엇입니까?2011-08-12T20:17:46.384Z

는 다음과 .2011-08-12T20:17:46.384Z게게무 ?슨 식? ???1.DateFormat.getDateInstance().parse(dateStr) 나는

java.text.Parse Exception:해석 불가일 : '2011-08-12T20:17:46.384Z'

해석에는 SimpleDateFormat을 사용해야 한다고 생각합니다만, 우선 형식 문자열을 알아야 합니다.지금까지 내가 가진 거라곤yyyy-MM-dd왜냐하면 난 그게 뭔지 모르기 때문이야T이 문자열에서 시간대와 관련된 어떤 것을 의미하나요?은 " " 에서 .lcmis:downloadedOn태그는 [Files CMIS download history media type]에 표시됩니다.

T는 날짜와 시간을 구분하기 위한 리터럴일 뿐이고 Z는 "제로 시간 오프셋"을 의미하며 "줄루 시간"(UTC)이라고도 합니다.문자열에 항상 "Z"가 있는 경우 다음을 사용할 수 있습니다.

SimpleDateFormat format = new SimpleDateFormat(
    "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.US);
format.setTimeZone(TimeZone.getTimeZone("UTC"));

또는 Joda Time을 사용하여 를 사용할 수 있습니다.

dr;dr

입력 문자열에서 표준 ISO 8601 형식을 사용합니다.

Instant.parse ( "2011-08-12T20:17:46.384Z" ) 

ISO 8601

이 형식은 실용적인 표준인 ISO 8601에 의해 정의됩니다.

T는 날짜 부분과 시각 부분을 구분합니다.Zend는 UTC(즉, UTC로부터의 오프셋)를 의미합니다.Z'줄루'로 발음됩니다.

java.time

Java의 초기 버전과 함께 번들된 오래된 날짜 클래스는 설계가 부실하고 혼란스러우며 번거롭다는 것이 입증되었습니다.그들을 피하세요.

대신 Java 8 이후에 내장된 java.time 프레임워크를 사용합니다.java.time 클래스는 오래된 날짜 시간 클래스와 매우 성공적인 Joda-Time 라이브러리를 모두 대체합니다.

java.time 클래스는 날짜 값의 텍스트 표현을 해석/생성할 때 기본적으로 ISO 8601을 사용합니다.

클래스는 타임라인상의 시간을 UTC 단위나노초의 분해능으로 나타냅니다.이 클래스는 포맷 패턴을 정의할 필요 없이 입력 문자열을 직접 해석할 수 있습니다.

Instant instant = Instant.parse ( "2011-08-12T20:17:46.384Z" ) ;

Java의 날짜 유형 표(현대 및 레거시 모두)


java.time 정보

java.time 프레임워크는 Java 8 이후에 포함되어 있습니다.이러한 클래스는 , 및 등 문제가 많은 오래된 레거시 날짜 시간 클래스를 대체합니다.

자세한 내용은 Oracle 자습서를 참조하십시오.또한 Stack Overflow를 검색하여 많은 예와 설명을 확인하십시오.사양은 JSR 310입니다.

현재 유지보수 모드에 있는 조다 타임 프로젝트는 java.time 클래스로의 이행을 권장합니다.

java.time 객체를 데이터베이스와 직접 교환할 수 있습니다.JDBC 4.2 이후준거한JDBC 드라이버를 사용합니다.스트링도 필요 없고java.sql.*반.휴지 상태 5 및 JPA 2.2는 java.time을 지원합니다.

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

Java 또는 Android 버전에 사용할 java.time 라이브러리의 표

Java 해석에 대해서는 잘 모르지만 ISO8601:http://en.wikipedia.org/wiki/ISO_8601

첫 번째 답변이 아닌 다른 해석 방법이 있습니다.★★★★★★★★★★★★★★★★★★:

1) 를 얻고 는 (1) 시기로 ZonedDatetime(Java 8 이후) 또는Date 오브젝트 (오래된) 오브젝트:

// ZonedDateTime's default format requires a zone ID(like [Australia/Sydney]) in the end.
// Here, we provide a format which can parse the string correctly.
DateTimeFormatter dtf = DateTimeFormatter.ISO_DATE_TIME;
ZonedDateTime zdt = ZonedDateTime.parse("2011-08-12T20:17:46.384Z", dtf);

또는

// 'T' is a literal.
// 'X' is ISO Zone Offset[like +01, -08]; For UTC, it is interpreted as 'Z'(Zero) literal.
String pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSX";

// since no built-in format, we provides pattern directly.
DateFormat df = new SimpleDateFormat(pattern);

Date myDate = df.parse("2011-08-12T20:17:46.384Z");

2) 않고 단위로 처리하고 (2) 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아,Instant:

// The ISO format without zone ID is Instant's default.
// There is no need to pass any format.
Instant ins = Instant.parse("2011-08-12T20:17:46.384Z");

java.time

없다DateTimeFormatter지정된 날짜/시간 문자열을 해석합니다.

Java SE 8 Date-Time API()java.timeAPI 또는 최신 Date-Time API)는 ISO 8601을 기반으로 하며,DateTimeFormatter날짜-시간 문자열이 ISO 8601 표준을 준수하는 한 명시적으로 개체를 지정합니다.

Zstring은 제로 타임존 오프셋의 타임존 지정자입니다.이것은 Zulu를 의미하며,Etc/UTC)+00:00□□□□□□□□★

T문자열에는 ISO-8601 표준에 따라 날짜-시간 구분 기호만 있습니다.

데모:

import java.time.Instant;
import java.time.OffsetDateTime;
import java.time.ZonedDateTime;

public class Main {
    public static void main(String[] args) {
        String strDateTime = "2011-08-12T20:17:46.384Z";

        Instant instant = Instant.parse(strDateTime);
        OffsetDateTime odt = OffsetDateTime.parse(strDateTime);
        ZonedDateTime zdt = ZonedDateTime.parse(strDateTime);
        
        System.out.println(instant);
        System.out.println(odt);
        System.out.println(zdt);
    }
}

출력:

2011-08-12T20:17:46.384Z
2011-08-12T20:17:46.384Z
2011-08-12T20:17:46.384Z

★★★의 java.timeTrail: Date Time의 최신 Date-Time* API.

레거시 Date-time API

APIDate-time API」)java.utilDate-Time API와 그 포맷 API,SimpleDateFormat)는 오래되어 오류가 발생하기 쉽습니다.완전히 사용을 중지하고 최신 Date-Time* API로 전환하는 것이 좋습니다.

완성도를 높이기 위해 레거시 API를 사용하여 이 Date-Time 문자열을 해석하는 솔루션을 작성했습니다.

「 」를하지 주세요.'Z'Date-Time API 입니다.

한 바와 같이, 「 」는, 「 」입니다.Z따옴표 은 제로 이며, (따옴표 없음)는 제로 타임존 오프셋의 지정자입니다.'Z'문자 그대로일 뿐 아무런 의미도 없습니다. 하다라는 쓰세요.y-M-d'T'H:m:s.SSSXXX이러한 기호에 대한 자세한 내용은 설명서를 참조하십시오.

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

public class Main {
    public static void main(String[] args) throws ParseException {
        String strDateTime = "2011-08-12T20:17:46.384Z";

        SimpleDateFormat sdf = new SimpleDateFormat("y-M-d'T'H:m:s.SSSXXX", Locale.ENGLISH);
        Date date = sdf.parse(strDateTime);
        // ...
    }
}

과 같습니다.java.util.Date오브젝트는 현대의 Date-Time 타입과 같은 실제 Date-Time 오브젝트가 아닙니다.오브젝트는 표준 베이스 타임으로부터 「에폭」으로 알려진 밀리초수를 나타냅니다.January 1, 1970, 00:00:00 GMT( 는 utc UTC ) 및 즉 시간대가 적용되지 .EEE MMM dd HH:mm:ss z yyyy하여 JVM의 을 반환합니다.Date#toString이 밀리초 값에서 파생됩니다.할 필요가 있는 는, 「을 가 있습니다.SimpleDateFormat원하는 형식과 적용 가능한 시간대를 지정합니다.

sdf.setTimeZone(TimeZone.getTimeZone("Etc/UTC"));
String formatted = sdf.format(date);
System.out.println(formatted); // 2011-8-12T20:17:46.384Z

Joda 날짜-시간 API

Joda-Time 홈페이지 공지사항은 다음과 같습니다.

Java SE 8 이후 사용자는 이 프로젝트를 대체하는 JDK의 핵심 부분인 java.time(JSR-310)으로 마이그레이션해야 합니다.

다시 한 번 말씀드리지만, 저는 Joda Date-Time API를 사용하여 이 Date-Time 문자열을 해석하는 솔루션을 작성했습니다.

import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

public class Main {
    public static void main(String[] args) {
        String dateTimeStr = "2011-08-12T20:17:46.384Z";
        DateTimeFormatter dtf = DateTimeFormat.forPattern("y-M-d'T'H:m:s.SSSZ").withOffsetParsed();
        DateTime dateTime = dtf.parseDateTime(dateTimeStr);
        System.out.println(dateTime);
    }
}

출력:

2011-08-12T20:17:46.384Z

* 어떤 이유로든 Java 6 또는 Java 7을 고수해야 하는 경우 Java 6 및 7에 대한 대부분의 java.time 기능을 백포트하는 ThreeTen 백포트를 사용할 수 있습니다.Android 프로젝트에 종사하고 있으며 Android API 레벨이 여전히 Java-8과 호환되지 않는 경우, 디수깅사용 방법을 통해 사용 가능한 Java 8+ API를 확인하십시오.Android Project의 ABP.

Android용 솔루션을 찾고 있다면 다음 코드를 사용하여 타임스탬프 문자열에서 에폭초(Epoch seconds)를 얻을 수 있습니다.

public static long timestampToEpochSeconds(String srcTimestamp) {
    long epoch = 0;

    try {
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
            Instant instant = Instant.parse(srcTimestamp);
            epoch = instant.getEpochSecond();
        } else {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss.SSSSSS'Z'", Locale.getDefault());
            sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
            Date date = sdf.parse(srcTimestamp);
            if (date != null) {
                epoch = date.getTime() / 1000;
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }

    return epoch;
}

입력 예: 2019-10-15T05:51:31.537979Z

출력 예: 1571128673

자바스크립트

let isoDateTimeString = new Date().toISOString();

묘사

"YYY-MM-DDTh:mm:ss.SSSZ"와 같은 날짜/시간 형식은 ISO 8601 날짜/시간 형식입니다.

다음 예를 사용할 수 있습니다.

    String date = "2011-08-12T20:17:46.384Z";

    String inputPattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";

    String outputPattern = "yyyy-MM-dd HH:mm:ss";

    LocalDateTime inputDate = null;
    String outputDate = null;


    DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern(inputPattern, Locale.ENGLISH);
    DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern(outputPattern, Locale.ENGLISH);

    inputDate = LocalDateTime.parse(date, inputFormatter);
    outputDate = outputFormatter.format(inputDate);

    System.out.println("inputDate: " + inputDate);
    System.out.println("outputDate: " + outputDate);

이 기술은 java.util을 변환합니다.UTC 형식(또는 다른 형식)으로 날짜 지정 후 다시 돌아옵니다.

다음과 같이 클래스를 정의합니다.

import java.util.Date;

import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

public class UtcUtility {

public static DateTimeFormatter UTC = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").withZoneUTC();


public static Date parse(DateTimeFormatter dateTimeFormatter, String date) {
    return dateTimeFormatter.parseDateTime(date).toDate();
}

public static String format(DateTimeFormatter dateTimeFormatter, Date date) {
    return format(dateTimeFormatter, date.getTime());
}

private static String format(DateTimeFormatter dateTimeFormatter, long timeInMillis) {
    DateTime dateTime = new DateTime(timeInMillis);
    String formattedString = dateTimeFormatter.print(dateTime);
    return formattedString;
}

}

그런 다음 다음과 같이 사용합니다.

Date date = format(UTC, "2020-04-19T00:30:07.000Z")

또는

String date = parse(UTC, new Date())

필요에 따라서(UTC 뿐만이 아니라) 다른 날짜 형식을 정의할 수도 있습니다.

@John-Skeet는 나에게 이 문제를 해결할 수 있는 실마리를 주었다.젊은 프로그래머로서 이 작은 문제는 놓치기 쉽고 진단하기도 어렵습니다.그래서 저는 누군가에게 도움이 되길 바라며 그것을 공유합니다.

문제는 영향을 미치지 않는 JSON의 타임스탬프를 포함하는 다음 문자열을 해석하여 보다 유용한 변수에 넣는 것이었습니다.그런데 자꾸 오류가 나더라고요.

따라서 다음과 같이 지정됩니다(Pattern() 내의 문자열 파라미터에 주의해 주십시오.

String str = "20190927T182730.000Z"

LocalDateTime fin;
fin = LocalDateTime.parse( str, DateTimeFormatter.ofPattern("yyyyMMdd'T'HHmmss.SSSZ") );

오류:

Exception in thread "main" java.time.format.DateTimeParseException: Text 
'20190927T182730.000Z' could not be parsed at index 19

?? 는 '처럼 .패턴의 끝에 있는 Z는 'T'와 마찬가지로 'Z'로 감싸야 합니다."yyyyMMdd'T'HHmmss.SSSZ"로로 합니다."yyyyMMdd'T'HHmmss.SSS'Z'"그리고 그것은 동작한다.

패턴에서 Z를 모두 삭제해도 오류가 발생합니다.

솔직히 자바 클래스가 이걸 예상했을 거예요.

언급URL : https://stackoverflow.com/questions/8405087/what-is-this-date-format-2011-08-12t201746-384z

반응형