programing

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

bestcode 2022. 11. 7. 22:07
반응형

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

나는 내가 얻는 결과에 대해 매우 혼란스럽다.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

그래서 디폴트 타임존을 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

내가 뭘 빠트렸나요?

System.out.println(cal_Two.getTime())호출은 a를 반환합니다.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());

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

확실히 작은 것이 없습니다.즉, 디폴트값을 설정하지 않는 것입니다.

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()

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()

나에게 효과가 있다

    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;

}

나한텐 효과가 있어.

타임스탬프 유형 가져오기:

public static Timestamp getCurrentTimestamp() {
    TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
    final Calendar cal = Calendar.getInstance();
    Date date = cal.getTime();
    Timestamp ts = new Timestamp(date.getTime());
    return ts;
}

문자열 유형 가져오기:

    public static String getCurrentTimestamp() {
    TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
    final Calendar cal = Calendar.getInstance();
    Date date = cal.getTime();
    Timestamp ts = new Timestamp(date.getTime());
    return ts.toString();
}

사용해보십시오.GMT대신UTC같은 시간대를 가리키지만 이름은GMT더 흔하고 효과가 있을 수 있습니다.

언급URL : https://stackoverflow.com/questions/21349475/calendar-getinstancetimezone-gettimezoneutc-is-not-returning-utc-time

반응형