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

Поэтому я попытался изменить часовой пояс по умолчанию на 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 :)
Василь Валчев
1
Я понимаю ... спасибо ... Но я не понимаю, как установка часового пояса будет ответственностью класса simpleDateFormat. Изменение часового пояса изменяет фактическое время, а не его формат. Задача SimpleDateFormat - просто форматировать дату, а не манипулировать временем ....
angryITguy
Идеальный ответ !!
Наджиб Ахмед Путхавала
Это (необходимость установки часового пояса форматера) получает меня каждый раз, даже если я установил часовой пояс календаря.
Agi
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. Если зона равна нулю, сбросьте значение по умолчанию на значение, которое было изначально при первом запуске виртуальной машины.

Следовательно, переместив ваш setDefault()before, 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
PopoFibo
источник
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()

работает на меня

Fabian
источник
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более распространено и может работать.

Poitroae
источник
Использование GMT ​​даст те же результаты.
Джим