2017-09-13 12 views
0

나는 날짜를 파싱해야하는 서버로부터 오래 걸린다. 캘린더를 사용하고 있습니다.기본 GMT 시간이 Java로 설정된 캘린더를 만드는 방법

사실은 서버에서 변환 된 long (사용자 로컬 시간이 있음)이지만 기본 GMT로 가져오고 로컬 시간으로 변환합니다.

그래서 두 번 변환됩니다. 내가 올바르게 이해했기 때문에 어떻게 로컬로 변경하지 않고 보여줄 수 있습니까? 내 코드 :

Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"));   
calendar.setTimeInMillis(dateLong); 
SimpleDateFormat format1 = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); 
format1.format(cal.getTime()); 
+0

질문을 올바르게 이해하려면 "GMT"또는 현지 시간으로 변경 하시겠습니까? – procrastinator

+0

GMT의 @procrastinator. 로컬 시간대에 서버에서 가져 오지만 GMT에서이를 감지하고 다시 변환합니다. 따라서, GMT로 표시하면 (이미 변환 된 이후) 올바르게 표시해야합니다. –

+1

그것은 작동합니다. 고마워, 답변으로 게시하십시오! –

답변

1

Calendar 대신 SimpleDateFormat을 사용하십시오. 다음 코드는 정확한 결과를 보여줍니다.

SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); 
    df.setTimeZone(TimeZone.getTimeZone("GMT")); 
    String result = df.format(dateLong); 
    System.out.println(result); 
0

미안 해요, 난 당신이 밀리 초 단위로 시간을 추측 을 오해. 음, 거기에서 :

Date dateCreated = new Date(timeInMilliseconds); 

그리고 당신은 달력, 설정된 시간 후 바로 설정 시간대를 만들 때 setTimeInMillis 당신이 그것을의 인스턴스

Calendar calendar = Calendar.getInstance(); 
calendar.setTimeInMillis(new java.util.Date().getTime()); 
calendar.setTimeZone(TimeZone.getTimeZone("GMT")); 

를 만드는 이전 시간대 설정을 무시하기 때문에

+0

나는 이해하지 못한다. 결과는 다음과 같다. 2017-09-13T12 : 44 : 20Z –

+0

내가 잘못 생각한 것 같다. 그래서 밀리 세컨드 단위의 Date 객체를 가지고 있습니다. 그래서 Long 값으로 말하면서 무엇을하고 싶습니까?새 날짜 (timeInMilliseconds) – nineunderground

+0

을 만들 때 날짜가 이미 시간대 값으로 작성 되었기 때문에 서버에서 오랜 시간이 걸리지 만 사용자의 현지 시간대로 변환 된 것으로 생각합니다. 그러나, 나는 그것을 GMT로 받아서 사용자의 현지 시간대로 다시 변환한다. 그래서, 그것보다 2 시간 더 있습니다. 서버에서 변환 된 후 다시 변환하지 않고 어떻게 표시 할 수 있습니까 (기본적으로 달력 표준 시간대는 사용자 시간대이므로 날짜를 변환합니다). 나는 Calendar.getInstance (TimeZone.getTimeZone ("GMT"))로 시도했지만 작동하지 않았다. –

1

다른 답변은 이미 CalendarSimpleDateFormat와 솔루션을 제공합니다. 다른 접근법을 추가하고 싶습니다.

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

안드로이드에서 (프로젝트에 의존성을 추가하는 것에 대해 괜찮 으면 -이 경우에는 IMO의 가치가 있습니다) ThreeTen Backport은 Java 8의 새로운 날짜/시간 클래스에 훌륭한 백 포트입니다. 작동 시키려면 ThreeTenABP (자세한 사용 방법은 here)이 필요합니다.

먼저 org.threeten.bp.Instant을 사용하여 밀리 값을 해당 UTC 인스턴트로 변환 할 수 있습니다. 그런 다음 org.threeten.bp.format.DateTimeFormatter을 사용하여 원하는 형식을 정의하십시오.

long dateLong = System.currentTimeMillis(); 
// convert long millis value to Instant 
Instant instant = Instant.ofEpochMilli(dateLong); 
// create formatter in UTC 
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss") 
    .withZone(ZoneOffset.UTC); 
// format it 
System.out.println(fmt.format(instant)); 

출력 될 것 같은 뭔가 :

13/09/2017 11시 28분 2초

또한 포맷터는 UTC 날짜를 사용해야 함을 나타 내기 위해 org.threeten.bp.ZoneOffset를 사용