Programing

이 날짜 형식은 무엇입니까?

lottogame 2020. 3. 14. 10:03
반응형

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


다음 날짜가 2011-08-12T20:17:46.384Z있습니다.. 이것은 어떤 형식입니까? 나는 통해 자바 1.4로 구문 분석하기 위해 노력하고있어 DateFormat.getDateInstance().parse(dateStr)나는군요

java.text.ParseException : 구문 분석 할 수없는 날짜 : "2011-08-12T20 : 17 : 46.384Z"

구문 분석 위해 SimpleDateFormat사용해야한다고 생각 하지만 먼저 형식 문자열을 알아야합니다. 내가 지금까지 그것에 대해 모두는 yyyy-MM-dd내가 무엇을 모르기 때문에, T이 문자열의 수단을 - 뭔가 시간대 관련? 이 날짜 문자열은 파일 CMIS 다운로드 히스토리 매체 유형lcmis:downloadedOn 에 표시된 태그 에서 제공 됩니다.


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

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

또는 Joda Time 을 사용하면 사용할 수 있습니다 ISODateTimeFormat.dateTime().


tl; dr

입력 문자열에 표준 ISO 8601 형식이 사용됩니다.

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

ISO 8601

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

T시간의 일 부분에서 날짜 부분을 분리한다. Z끝에 수단 UTC를 (즉, 오프셋 - 제로 - UTC에서 시간 - 분 - 초). Z있다 "줄루어"로 발음 .

java.time

초기 버전의 Java와 번들로 제공되는 이전 날짜-시간 클래스는 잘못 설계되고 혼란스럽고 번거로운 것으로 입증되었습니다. 피하십시오.

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

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

Instant클래스는 나노초 의 해상도로 UTC 의 타임 라인에서 순간을 나타냅니다 . 해당 클래스는 형식 지정 패턴을 정의하지 않고도 입력 문자열을 직접 구문 분석 할 수 있습니다.

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

java.time에 대하여

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

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

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

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

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


Java 구문 분석에 대해서는 확실하지 않지만 ISO8601입니다. http://en.wikipedia.org/wiki/ISO_8601


첫 번째 대답보다는 구문 분석하는 다른 방법이 있습니다. 그것을 구문 분석 :

(1) 당신은 날짜와 시간에 대한 정보를 잡아 싶은 경우에, 당신은 그것을 구문 분석 할 수 있습니다 ZonedDatetime(이후 자바 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) 날짜와 시간을 신경 쓰지 않고 정보를 나노 초 단위로 취급하려면 다음을 사용할 수 있습니다 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");

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

    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.Date를 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에서 타임 스탬프를 금하는 다음 문자열을 구문 분석하고 아무런 영향을 미치지 않고 더 유용한 변수에 넣기를 원했습니다. 그러나 계속 오류가 발생했습니다.

따라서 다음을 고려하십시오 (ofPattern () 내부의 문자열 매개 변수에주의하십시오.

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를 제거하면 오류가 발생했습니다.

솔직히 Java 클래스가 이것을 기대했을 것입니다.

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

반응형