Calendar.getInstance (TimeZone.getTimeZone ( "UTC"))가 UTC 시간을 반환하지 않습니다.


106

Calendar.getInstance(TimeZone.getTimeZone("UTC"))메서드 호출로 얻은 결과와 정말 혼란 스럽습니다 .IST 시간을 반환합니다.

내가 사용한 코드는 다음과 같습니다.

Calendar cal_Two = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
System.out.println(cal_Two.getTime());

그리고 내가 얻은 응답은 다음과 같습니다.

Sat Jan 25 15:44:18 IST 2014

그래서 기본 TimeZone을 UTC로 변경 한 다음 확인한 다음 정상적으로 작동합니다.

Calendar cal_Two = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
System.out.println(cal_Two.getTime());

TimeZone tz  = TimeZone.getDefault() ;
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
Calendar cal_Three = Calendar.getInstance();
System.out.println(cal_Three.getTime());
TimeZone.setDefault(tz);

결과:

Sat Jan 25 16:09:11 IST 2014
Sat Jan 25 10:39:11 UTC 2014

여기에 뭔가 빠졌나요?

답변:


146

System.out.println(cal_Two.getTime())호출은을 반환 Date에서 getTime(). 그것은이다 Date에 대한 문자열로 변환지고있는 println, 그 변환은 기본 사용 IST귀하의 경우 시간대를.

원하는 시간대로 DateFormat.setTimeZone()를 인쇄하려면 명시 적으로를 사용해야 Date합니다.

편집 : @Laurynas의 의례, 이것을 고려하십시오.

TimeZone timeZone = TimeZone.getTimeZone("UTC");
Calendar calendar = Calendar.getInstance(timeZone);
SimpleDateFormat simpleDateFormat = 
       new SimpleDateFormat("EE MMM dd HH:mm:ss zzz yyyy", Locale.US);
simpleDateFormat.setTimeZone(timeZone);

System.out.println("Time zone: " + timeZone.getID());
System.out.println("default time zone: " + TimeZone.getDefault().getID());
System.out.println();

System.out.println("UTC:     " + simpleDateFormat.format(calendar.getTime()));
System.out.println("Default: " + calendar.getTime());

나는 이것을 잠시 찾고 있었다. 제목이 충분히 명시 적이 지 않습니까? 그건 그렇고, 도움을 주셔서 감사합니다
gavard.e

3
당신이 :)에서 System.out.println의 결과를 보여 주면 당신은 많은 시간을 사용하여 저장할 수 있습니다
바실 Valchev을

1
나는 이것을 얻는다 .. 감사합니다 .. 그러나 시간대 설정을 설정하는 것이 simpleDateFormat 클래스의 책임인지 이해가 안됩니다. 시간대를 변경하면 형식이 아닌 실제 시간이 변경됩니다. SimpleDateFormat의의 역할은 .... 그냥 시간을 조작 할 날짜를 포맷하는 것입니다
angryITguy

완벽한 답변 !!
Najib Ahmed Puthawala

이것은 (포맷터의 시간대를 설정해야 함) 캘린더의 시간대를 설정하더라도 매번 나를 얻습니다.
Agi Hammerthief

17

java.util.Date시간대와 무관합니다. 당신은 인쇄 할 때 cal_Two하지만 Calendar인스턴스가 자사의 시간대 설정을 가지고 UTC, cal_Two.getTime()반환 Date시간대가없는 인스턴스 (기본 시간대에 항상)

Calendar cal_Two = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
System.out.println(cal_Two.getTime());
System.out.println(cal_Two.getTimeZone());

산출:

 Sat Jan 25 16:40:28 IST 2014
    sun.util.calendar.ZoneInfo[id="UTC",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null] 

의 javadoc에서 TimeZone.setDefault()

getDefault 메서드에서 반환하는 TimeZone을 설정합니다. 영역이 null 인 경우 기본값을 VM이 처음 시작되었을 때의 원래 값으로 재설정합니다.

따라서 setDefault()이전 이동 cal_Two이 인스턴스화되어 올바른 결과를 얻을 수 있습니다.

TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
Calendar cal_Two = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
System.out.println(cal_Two.getTime());

Calendar cal_Three = Calendar.getInstance();
System.out.println(cal_Three.getTime());

산출:

Sat Jan 25 11:15:29 UTC 2014
Sat Jan 25 11:15:29 UTC 2014

6
Calendar currentTime = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
currentTime.set(Calendar.ZONE_OFFSET, TimeZone.getTimeZone("UTC").getRawOffset());
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, currentTime.get(Calendar.HOUR_OF_DAY));
calendar.getTimeInMillis()

나를 위해 일하고있다


5

확실히 작은 것이 누락되었으며 기본값을 설정하지 않았습니다.

TimeZone.setDefault(TimeZone.getTimeZone("UTC"));

따라서 코드는 다음과 같습니다.

TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
Calendar cal_Two = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
System.out.println(cal_Two.getTime());

설명 : 시간대를 변경하려면 다음을 사용하여 기본 시간대를 설정하십시오.TimeZone.setDefault()


0
    Following code is the simple example to change the timezone
public static void main(String[] args) {
          //get time zone
          TimeZone timeZone1 = TimeZone.getTimeZone("Asia/Colombo");
          Calendar calendar = new GregorianCalendar();
          //setting required timeZone
          calendar.setTimeZone(timeZone1);
          System.out.println("Time :" + calendar.get(Calendar.HOUR_OF_DAY)+":"+calendar.get(Calendar.MINUTE)+":"+calendar.get(Calendar.SECOND));

       }

시간대 목록을 보려면 다음 코드가 있습니다.

public static void main(String[] args) {

    String[] ids = TimeZone.getAvailableIDs();
    for (String id : ids) {
        System.out.println(displayTimeZone(TimeZone.getTimeZone(id)));
    }

    System.out.println("\nTotal TimeZone ID " + ids.length);

}

private static String displayTimeZone(TimeZone tz) {

    long hours = TimeUnit.MILLISECONDS.toHours(tz.getRawOffset());
    long minutes = TimeUnit.MILLISECONDS.toMinutes(tz.getRawOffset())
                              - TimeUnit.HOURS.toMinutes(hours);
    // avoid -4:-30 issue
    minutes = Math.abs(minutes);

    String result = "";
    if (hours > 0) {
        result = String.format("(GMT+%d:%02d) %s", hours, minutes, tz.getID());
    } else {
        result = String.format("(GMT%d:%02d) %s", hours, minutes, tz.getID());
    }

    return result;

}

-6

GMT대신 사용하십시오 UTC. 동일한 시간대를 참조하지만 이름 GMT이 더 일반적이며 작동 할 수 있습니다.


GMT를 사용하면 동일한 결과가 생성됩니다.
Jim
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.