Как изменить 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

Я тоже пробовал это, но результат все тот же:

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

Это решение нормально?

В 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/ .

  1. Класс Date/Timestamp представляет собой конкретный момент времени с точностью до миллисекунды с 1 января 1970 года, 00:00:00 GMT. Таким образом, разница во времени (от эпохи до текущего времени) будет одинаковой на всех компьютерах по всему миру, независимо от Timezone.

  2. Date/Timestamp не знает о данном времени, на котором находится часовой пояс.

  3. Если нам нужно время, основанное на часовом поясе, мы должны пойти на classы Calendar или SimpleDateFormat в java.

  4. Если вы попытаетесь напечатать объект Date / Timestamp, используя toString() , он преобразует и печатает время с часовым поясом по умолчанию вашего компьютера.

  5. Таким образом, мы можем сказать (Date / Timestamp). Объект .getTime () всегда будет иметь UTC (время в миллисекундах)

  6. В заключение 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); } 
  • ошибка с varargs и перегрузка?
  • Конвертация с 12 часов до 24 часов в java
  • Функция ROT-13 в java?
  • Java: функция переопределения для отключения проверки сертификата SSL
  • Как удалить специальные символы из строки?
  • Найти вызовы методов в проекте Eclipse
  • Как выполнить обратный вызов JAVA между classами?
  • Класс не является абстрактным и не отменяет ошибку в Java
  • Сообщения журнала коллекции мусора Java
  • Какое сжатие (GZIP - самый популярный) фильтр сервлетов?
  • Зачем отмечать локальные переменные и параметры метода как «final» в Java?
  • Interesting Posts

    HRESULT: 0x80131040: определение манифеста размещенной сборки не соответствует ссылке на сборку

    Есть ли редактор тегов ID3 ​​для iTunes на OS X?

    Android: поворот изображения в режиме просмотра изображения под углом

    Подсчитайте количество слов в файле PDF

    Лучший способ получить доступ к элементу управления в другой форме в Windows Forms?

    Как проверить, зарегистрирован ли пользователь в FB SDK 4.0 для Android?

    Eclipse сообщает об обновлении библиотеки позже, чем подключаемый модуль ADT

    Запуск «corova build android» – не удалось найти атрибут android: fontVariationSettings and android: ttcIndex

    Нерекурсивный алгоритм первого поиска глубины

    Формирование «грамматик» Mockito

    Как получить время начала и окончания дня?

    Истеризация streamов в управляемом компоненте JSF для запланированных задач с использованием таймера

    Почему неназванное пространство имен является «превосходной» альтернативой статическому?

    Автоматический вход в систему и блокировка

    Внутреннее соединение DataTables в C #

    Давайте будем гением компьютера.