[java] 이 날짜 형식은 무엇입니까? 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의 날짜-시간 유형 테이블


java.time에 대하여

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

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

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

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

Java 또는 Android 버전과 함께 사용할 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");


답변

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

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


답변

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

    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뿐만 아니라 다른 날짜 형식을 정의 할 수도 있습니다.