Подтвердить что ты не робот

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

Итак, я попытался изменить 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

Я что-то пропустил?

4b9b3361

Ответ 1

Вызов 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());

Ответ 2

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. Если зона имеет значение null, reset по умолчанию значение, которое оно первоначально имело, когда виртуальная машина сначала началось.

Следовательно, перемещая ваш 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

Ответ 3

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

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

Ответ 4

    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;

}

Ответ 5

Попробуйте использовать GMT вместо UTC. Они относятся к одному и тому же часовому поясу, но имя GMT более распространено и может работать.