Как изменить TIMEZONE для java.util.Calendar / Date
Я хотел бы изменить значение TIMEZONE в экземпляре Java Calendar во время выполнения. Я попробовал ниже. Но в обоих случаях вывод одинаковый:
Calendar cSchedStartCal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); System.out.println(cSchedStartCal.getTime().getTime()); cSchedStartCal.setTimeZone(TimeZone.getTimeZone("Asia/Calcutta")); System.out.println(cSchedStartCal.getTime().getTime());
ВЫВОД:
1353402486773
1353402486773
Я тоже пробовал это, но результат все тот же:
- Рисование прямоугольника, который не исчезнет в следующей краске
- @Transactional метод вызова другого метода без @Transactional anotation?
- Будет ли Hibernate очищать мой обновленный постоянный объект при вызове session.close () с помощью FlushMode.AUTO?
- Где я могу разместить свои учетные данные при использовании Ivy и репозитория частной компании?
- Различия между System.out.println () и возвратом в Java
Calendar cSchedStartCal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); System.out.println(cSchedStartCal.getTime()); Calendar cSchedStartCal1 = Calendar.getInstance(TimeZone.getTimeZone("Asia/Calcutta")); cSchedStartCal1.setTime(cSchedStartCal.getTime()); System.out.println(cSchedStartCal.getTime());
В API я вижу комментарий ниже, но я не могу понять многое из этого:
* calls: cal.setTimeZone(EST); cal.set(HOUR, 1); cal.setTimeZone(PST). * Is cal set to 1 o'clock EST or 1 o'clock PST? Answer: PST. More * generally, a call to setTimeZone() affects calls to set() BEFORE AND * AFTER it up to the next call to complete().
Не могли бы вы мне помочь?
Одно возможное решение:
Calendar cSchedStartCal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); long gmtTime = cSchedStartCal.getTime().getTime(); long timezoneAlteredTime = gmtTime + TimeZone.getTimeZone("Asia/Calcutta").getRawOffset(); Calendar cSchedStartCal1 = Calendar.getInstance(TimeZone.getTimeZone("Asia/Calcutta")); cSchedStartCal1.setTimeInMillis(timezoneAlteredTime);
Это решение нормально?
- Управление данными сеанса Webapp / streamом controllerа для нескольких вкладок
- Установите время до 00:00:00
- Как преобразовать число в слова в java
- Есть ли способ запустить метод / class только при запуске Tomcat / Wildfly / Glassfish?
- Как заполнить форму Jsoup?
- Функции обратного вызова в Java
- Перечисление Java и дополнительные файлы classов
- Когда вы будете использовать WeakHashMap или WeakReference?
В Java Даты отображаются внутри UTC в миллисекундах с эпохи (так что часовые пояса не учитываются, поэтому вы получаете одинаковые результаты, так как getTime()
дает вам упомянутые миллисекунды).
В вашем решении:
Calendar cSchedStartCal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); long gmtTime = cSchedStartCal.getTime().getTime(); long timezoneAlteredTime = gmtTime + TimeZone.getTimeZone("Asia/Calcutta").getRawOffset(); Calendar cSchedStartCal1 = Calendar.getInstance(TimeZone.getTimeZone("Asia/Calcutta")); cSchedStartCal1.setTimeInMillis(timezoneAlteredTime);
вы просто добавляете смещение от GMT к указанному часовому поясу («Азия / Калькутта» в вашем примере) в миллисекундах, так что это должно работать нормально.
Другим возможным решением было бы использование статических полей classа Calendar
:
//instantiates a calendar using the current time in the specified timezone Calendar cSchedStartCal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); //change the timezone cSchedStartCal.setTimeZone(TimeZone.getTimeZone("Asia/Calcutta")); //get the current hour of the day in the new timezone cSchedStartCal.get(Calendar.HOUR_OF_DAY);
Для более подробного объяснения обратитесь к stackoverflow.com/questions/7695859/ .
-
Класс
Date/Timestamp
представляет собой конкретный момент времени с точностью до миллисекунды с 1 января 1970 года, 00:00:00 GMT. Таким образом, разница во времени (от эпохи до текущего времени) будет одинаковой на всех компьютерах по всему миру, независимо от Timezone. -
Date/Timestamp
не знает о данном времени, на котором находится часовой пояс. -
Если нам нужно время, основанное на часовом поясе, мы должны пойти на classы Calendar или SimpleDateFormat в java.
-
Если вы попытаетесь напечатать объект Date / Timestamp, используя
toString()
, он преобразует и печатает время с часовым поясом по умолчанию вашего компьютера. -
Таким образом, мы можем сказать (Date / Timestamp). Объект .getTime () всегда будет иметь UTC (время в миллисекундах)
-
В заключение
Date.getTime()
будетDate.getTime()
время UTC, ноtoString()
относится к конкретному часовому поясу, а не к UTC.
Теперь, как мне создать / изменить время по указанному часовому поясу?
Приведенный ниже код дает вам дату (время в миллисекундах) с указанными часовыми поясами. Единственная проблема заключается в том, что вы должны указывать дату в строчном формате.
DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd HH:mm:ss"); dateFormatLocal.setTimeZone(timeZone); java.util.Date parsedDate = dateFormatLocal.parse(date);
Используйте dateFormat.format
для ввода ввода Date (всегда UTC), часового пояса и даты возврата в качестве String.
Как сохранить время UTC / GMT в БД:
Если вы напечатаете объект parsedDate
, время будет в часовом поясе по умолчанию. Но вы можете сохранить время UTC в БД, как показано ниже.
Calendar calGMT = Calendar.getInstance(TimeZone.getTimeZone("GMT")); Timestamp tsSchedStartTime = new Timestamp (parsedDate.getTime()); if (tsSchedStartTime != null) { stmt.setTimestamp(11, tsSchedStartTime, calGMT ); } else { stmt.setNull(11, java.sql.Types.DATE); }