Календарь.getInstance (часовой пояс.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


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

409   6  

6 ответов:

The System.out.println(cal_Two.getTime()) вызов возвращает a 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());

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() до 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
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;

}

вам определенно не хватает маленькой вещи, и это вы не устанавливаете значение по умолчанию:

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

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

Comments

    Ничего не найдено.