2017-09-19 3 views
1

에서 내가 milliseconds이를 변환 할이 2016-11-25T09:29:10.588+01:00포맷 ISO 8601 자바 7

같은 날짜 형식이 나중에 내가 다시 밀리 초 "yyyy-MM-dd HH:mm:ss.SSS"이 형식을 변환해야 인쇄하는 동안.

static FastDateFormat alarmDateFormat = FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss.SSS"); 
DateFormat df1 = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss.SSSXXX"); 
df1.setTimeZone(TimeZone.getTimeZone("UTC")); 
String string1 = "2016-11-25T09:29:10.588+01:00"; 
Date result1 = df1.parse(string1); 
long timeStamp = result1.getTime(); 
System.out.println("timeStamp : " +timeStamp); 
String eventTime = alarmDateFormat.format(timeStamp); 
System.out.println("AfterConverting : " + eventTime); 

결과 :

timeStamp : 1480062550588 
AfterConverting : 2016-11-25 13:59:10.588 

Date 적당한하지만 시간이 상이하다. "UTC"로 설정하려고 시도했지만 도움이되지 않았습니다.

참고 :이 즉시 모든 같은 다른 라이브러리와 잘 작동 자바 8에서하지만 우리는 자바 당신은 df1에서 setTimeZone를 호출하고 7

+1

"시간대를"UTC "로 설정하려고했으나 도움이되지 않았습니다. - 물론 FastDateFormat의 시간대를 설정하면됩니다. 그건. 시간대 설정 방법을 보여주십시오. –

+0

df1.setTimeZone (TimeZone.getTimeZone ("UTC")); –

+1

@HarshaG 항상 새로운 정보로 질문을 업데이트하십시오 (편집 가능). – timiTao

답변

3

에 싶었지만,이 포매터 만 구문 분석을 위해 사용되며, 서식 지정에 영향을 미치지 않습니다.

날짜를 특정 시간대로 포맷하려면 다른 포맷터에서 설정해야합니다 (설정하지 않으면 JVM 기본 시간대가 사용됩니다). 또한 FastDateFormat과 같은 다른 클래스에 의존 할 필요가 없으며 다른 SimpleDateFormat을 사용하기 만하면됩니다.

정확히 동일한 날짜/시간을 얻으려면 입력에 사용 된 것과 동일한 오프셋 (+01:00)을 사용해야합니다. Date 오브젝트 don't keep this information이므로 입력에서 추출해야합니다. 한 가지 방법은 사용하는 것입니다 substring :

SimpleDateFormat df1 = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss.SSSXXX"); 
String string1 = "2016-11-25T09:29:10.588+01:00"; 
Date result1 = df1.parse(string1); 
long timeStamp = result1.getTime(); 
System.out.println("timeStamp : " + timeStamp); 

// extract the +01:00 offset from the input 
String offset = string1.substring(23); 
SimpleDateFormat df2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); 
// set the offset in the formatter (so output is converted to it) 
df2.setTimeZone(TimeZone.getTimeZone("GMT" + offset)); 
String eventTime = df2.format(timeStamp); 
System.out.println("AfterConverting : " + eventTime); 

출력은 다음과 같습니다

소인 1480062550588
AfterConverting : 2016년 11월 25일 09 : 29 : 10.588

하는 경우 FastDateFormat을 계속 사용하려면 해당 시간대를 설정하는 것이 가능합니다.

FastDateFormat f = FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss.SSS", TimeZone.getTimeZone("GMT" + offset)); 
String eventTime = f.format(timeStamp); 

자바 새로운 날짜/시간 API

오래된 클래스 (Date, CalendarSimpleDateFormat)는 lots of problemsdesign issues 있고, 그들은 새로운 API로 대체되고 있습니다.

Java 7의 경우 Java 8의 새로운 날짜/시간 클래스에 유용한 백 포트 인 ThreeTen Backport을 사용할 수 있습니다. Android의 경우 ThreeTenABP (자세한 사용 방법은 here)이 필요합니다.

이렇게하면 입력을 org.threeten.bp.OffsetDateTime으로 구문 분석하고 org.threeten.bp.format.DateTimeFormatter을 출력으로 사용할 수 있습니다.이 경우, OffsetDateTime는 오프셋 정보를 유지, 그래서 당신은 포맷터에서 그것을 설정할 필요가 없습니다 :

OffsetDateTime odt = OffsetDateTime.parse(string1); 
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"); 
System.out.println("timeStamp : " + odt.toInstant().toEpochMilli()); 
System.out.println("AfterConverting : " + odt.format(fmt)); 

출력은 동일합니다

소인 1480062550588
AfterConverting : 2016-11-25 09 : 29 : 10.588

관련 문제