Календарь.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
Я что-то пропустил?
6 ответов:
The
System.out.println(cal_Two.getTime())вызов возвращает aDateС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 timezonepublic 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