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
Я что-то пропустил?
Ответы
Ответ 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
более распространено и может работать.