이 날짜 형식은 무엇입니까? 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 클래스는 어디서 구할 수 있습니까?
- 자바 SE 8 , 자바 SE 9 , 나중에
- 내장.
- 번들로 구현 된 표준 Java API의 일부입니다.
- Java 9에는 몇 가지 사소한 기능과 수정 사항이 추가되었습니다.
- Java SE 6 및 Java SE 7
- 대부분의 java.time 기능은 ThreeTen-Backport의 Java 6 & 7로 백 포트됩니다 .
- 기계적 인조 인간
- java.time 클래스의 최신 버전의 Android 번들 구현.
- 이전 Android의 경우 ThreeTenABP 프로젝트 는 위에서 언급 한 ThreeTen-Backport를 채택합니다 . ThreeTenABP 사용 방법…을 참조하십시오 .
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
'Programing' 카테고리의 다른 글
build.plugins.plugin.version에 대한 Maven 3 경고 (0) | 2020.03.14 |
---|---|
탐욕스럽지 않은 정규식을 작성하려면 어떻게해야합니까? (0) | 2020.03.14 |
자바 힙 용어 : 젊고 오래된 세대와 영원한 세대? (0) | 2020.03.14 |
Lightsail과 EC2의 차이점은 무엇입니까? (0) | 2020.03.14 |
== 이상의 String.Equals를 사용하는 이유는 무엇입니까? (0) | 2020.03.14 |