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в потрібному часовому поясі.

EDIT: люб’язно надано @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 :)
Василь Валчев

1
Я отримую це .. дякую .. Але я не розумію, як встановлення налаштування часового поясу було б відповідальністю класу simpleDateFormat. Зміна часового поясу змінює фактичний час, а не його формат. Завдання SimpleDateFormat - це просто форматувати дату, а не маніпулювати часом ....
сердитоTguy

Ідеальний відповідь !!
Наджіб Ахмед Путхавала

Це (потрібно встановити часовий пояс форматера) отримує мене щоразу, навіть якщо я встановлюю часовий пояс календаря.
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()

Встановлює TimeZone, що повертається методом getDefault. Якщо зона є нульовою, скиньте за замовчуванням значення, яке воно було спочатку під час першого запуску 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 дасть ті самі результати.
Джим
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.