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