2014-01-20 1 views
3

java를 사용하여 String 형식의 날짜를 java.util.Date로 변환하려고했습니다. text.SimpleDateFormat, 그러나 그것은 나에게 올바른 결과를주지 못한다. 도와주세요!"yyyy-MM-dd'T'HH : mm : ss.SSSSSSZZZZZ"읽는 동안 java.text.SimpleDateFormat에 대한 잘못된 출력

내 입력은 장고 날짜에 의해 생성됩니다. 예 : 대신 "월 1월 20일 15"2014-01-20T07 : 17 : 06.150995 + 00 : 00 "

그러나, 나는"2014 : 00 : + 08 19시 36분 GMT 월 년 1 월 20 15 "를 가지고 : 17시 6분 GMT + 08 : 00 2014 "

가 여기 내 테스트 코드입니다 :

String s = "2014-01-20T07:17:06.150995+00:00"; 

SimpleDateFormat sdf; 
String fmt = "yyyy-MM-dd'T'HH:mm:ss.SSSSSSZZZZZ"; 
sdf = new SimpleDateFormat(fmt, Locale.US); 

String result = ""; 
try { 
    Date date = sdf.parse(s); 
    Log.d(Constants.LOG_TAG, date.toString()); 
    result = date.toString(); 
} catch (Exception e) { 
    Log.d(Constants.LOG_TAG, "date formatting error" + e.getMessage()); 
} 
Log.d(Constants.LOG_TAG, "date test >> " + result); 
+0

나에게 시간대 것 같은데. –

+1

@HotLicks : 2.5 분 시간대? – Keppil

+0

Android 기기 (Nexus 7)에서이 코드를 테스트하고 있습니다. 어떤 차이가 있습니까? –

답변

6

당신이 두 날짜가 2.5 분 차이 볼 수 있듯이.

이는 밀리 초로 구문 분석을 수행하기 때문에 발생합니다. 결과에 150000 밀리 초 또는 2.5 분이 추가됩니다.

SimpleDateFormat을 사용하여 마이크로 초 단위로 날짜 문자열을 구문 분석하는 표준 방법이 없기 때문에 다른 형식으로 소스 문자열을 가져올 수없는 경우 직접해야합니다. 내가 먼저 내가 가진 (에서 System.out.println()으로 Log.d 대체) 코드를 실행하려고으로

String dateWithoutMicros = s.substring(0, s.length() - 9) + s.substring(s.length() - 6); 
Date date = sdf.parse(dateWithoutMicros); 
+0

그렇다면 어떻게이 문제를 해결할 수 있습니까? 나는이 사이트가 도움이 될 것이라고 생각한다 : http : //stackoverflow.com/questions/19223171/java-util-date-format-ssssss-if-not-microseconds-what-are-the-last-3-digits –

+0

그 질문은 : 구문 분석이 아니라 형식화에 관한 것이므로 실제로 도움이되지 않습니다. – Keppil

+0

니스! 좋아, 나는 3 자리를 제거 할 것이다. 감사! –

2

: 날짜가 정확히이 형식으로 항상 경우

당신이 뭔가를 할 수 ParseException : 파싱 할 수없는 날짜.

다음 각 날짜의 여러 부분을 각각의 형식 문자열 부분으로 시도했습니다. 마지막으로 문제는 각각 "ZZZZZ"시간대 부분 "+00 : 00"이었습니다.

나는 문서 ( http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html)의 패턴 문자에 대해 읽어 발견 :
Z -> -0800
X -> 08; -0800; -08 : 00
그래서 ZZZZZ를 X로 바꾼 다음 제게 잘되었습니다. 최종 형식 문자열 : java.util.Date의 & .Calendar 및 java.text.SimpleTextFormat 클래스를 사용하여
String fmt = "yyyy-MM-dd'T'HH:mm:ss.SSSSSSX";

1

마십시오. 그들은 귀찮게 골칫거리입니다.

는 Joda 타임

타사 오픈 소스 Joda-Time 2.3 라이브러리를 사용하여, 당신은 ISO 8601 생성자에 직접 문자열을 포맷 것을 전달할 수 있습니다. 포맷터와 파서가 필요 없습니다.

그러나 java.util.Date와 마찬가지로 Joda-Time의 해상도는 밀리 초 인 입니다. 따라서 초의 1/3 자리 만 처리 할 수 ​​있습니다. 다행스럽게도, Joda-Time은 예외를 통하는 것보다 후자의 여분의 소수 자릿수를 잘라 버립니다 (무시).

String s = "2014-01-20T07:17:06.150995+00:00"; DateTime dateTime = new DateTime(s); System.out.println("dateTime: " + dateTime); System.out.println("dateTime in UTC/GMT: " + dateTime.toDateTime(DateTimeZone.UTC)); 

실행

...

dateTime: 2014-01-19T23:17:06.150-08:00 
dateTime in UTC/GMT: 2014-01-20T07:17:06.150Z 

java.time. * 클래스입니다 java.time에서

자바 (8)와 함께 번들로 새로운 클래스

. * 패키지는 java.util의를 대신하다. 날짜 &. 달력 클래스. Joda-Time에서 영감을 얻었지만 완전히 재구성되었습니다. JSR 310은 이러한 클래스를 정의합니다.

이러한 새 클래스는 밀리 초가 아니라 나노초 () 해상도를 가지므로 6 자리 소수 자릿수를 모두 처리 할 수 ​​있습니다. Joda-Time처럼 ISO 8601 문자열을 직접 사용합니다.

String s = "2014-01-20T07:17:06.150995+00:00"; ZonedDateTime zdt = ZonedDateTime.parse(s); System.out.println("zdt: " + zdt); 

실행

...

zdt: 2014-01-20T07:17:06.150995Z