Преобразование дат UTC в другие часовые пояса

Я конвертирую время UTC в другой часовой пояс, используя этот метод:

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date parsed = format.parse("2011-03-01 15:10:37"); TimeZone tz = TimeZone.getTimeZone("America/Chicago"); format.setTimeZone(tz); String result = format.format(parsed); 

Таким образом, ввод 2011-03-01 15:10:37 но выход этого (значение результата) – 2011-03-01 05:40:37 . В то время как это кажется выключенным, и согласно этой ссылке , это должно быть 2011-03-01 09:10:37 .

Что я делаю не так?

Оказывается, код был почти правильным, что я не принимал во внимание, так это то, что при parsingе String для получения объекта Date изначально он использует систему TimeZone умолчанию, поэтому исходная дата не была в UTC, как я ожидал.

Хитрость заключалась в том, чтобы установить часовой пояс при parsingе даты в формате UTC, а затем установить ее на часовой пояс назначения. Что-то вроде этого:

 SimpleDateFormat sourceFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); sourceFormat.setTimeZone(TimeZone.getTimeZone("UTC")); Date parsed = sourceFormat.parse("2011-03-01 15:10:37"); // => Date is in UTC now TimeZone tz = TimeZone.getTimeZone("America/Chicago"); SimpleDateFormat destFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); destFormat.setTimeZone(tz); String result = destFormat.format(parsed); 

Преобразование даты Строка формата «2011-06-23T15: 11: 32» для выхода из часового пояса.

  private String getDate(String dateString) { SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); formatter.setTimeZone(TimeZone.getTimeZone("UTC")); Date value = null; try { value = formatter.parse(dateString); } catch (ParseException e) { e.printStackTrace(); } SimpleDateFormat dateFormatter = new SimpleDateFormat("dd/MM/yyyy hh:mmaa"); dateFormatter.setTimeZone(TimeZone.getDefault()); String dt = dateFormatter.format(value); return dt; } 

Вы должны учитывать летние сбережения. Я делаю это, разрабатывая смещение (от UTC) в миллисекундах. Что-то вроде этого должно работать.

 int currentOffsetFromUTC = tz.getRawOffset() + (tz.inDaylightTime(parsed) ? tz.getDSTSavings() : 0); String result = format.format(parsed.getTime() + currentOffsetFromUTC); 

Метод inDayLightTime(...) возвращает логическое значение и должен быть передан объект Date, чтобы он мог решить, соответствует ли эта дата «дате» в течение периода летнего времени или нет.

Вы можете проанализировать формат даты и часовой пояс в соответствии с вашими требованиями. Попробуйте этот fragment кода, надеюсь, он вам поможет.

 private String getFormattedDate(String OurDate) { try { SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); // According to your Server TimeStamp formatter.setTimeZone(TimeZone.getTimeZone("UTC")); //your Server Time Zone Date value = formatter.parse(OurDate); // Parse your date SimpleDateFormat dateFormatter = new SimpleDateFormat("MM-dd-yyyy"); //this format changeable according to your choice dateFormatter.setTimeZone(TimeZone.getDefault()); OurDate = dateFormatter.format(value); } catch (Exception e) { OurDate = "00-00-0000 00:00"; } return OurDate; } 

Следующий код отлично подходит для меня, чтобы изменить дату с одного tz на другой. Он также рассматривает DayLightSaving.

 public static Calendar changeTimezoneOfDate(Date date, TimeZone fromTZ, TimeZone toTZ) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); long millis = calendar.getTimeInMillis(); long fromOffset = fromTZ.getOffset(millis); long toOffset = toTZ.getOffset(millis); long convertedTime = millis - (fromOffset - toOffset); Calendar c = Calendar.getInstance(); c.setTimeInMillis(convertedTime); return c; } 
  • Как получить текущий часовой пояс MySQL?
  • Установите системный часовой пояс из .NET.
  • Как справиться с летней экономией, используя TimeZone в Java
  • Часовой пояс с рельсами 3
  • Как установить часовой пояс по умолчанию в node.js?
  • Как мне заполнить список часовых поясов IANA / Olson от Noda Time?
  • Параметр DateTime с часовым поясом формы PST / CEST / UTC / etc.
  • Драйвер JDBC MySQL 5.1.33 - Проблема с часовым поясом
  • Как использовать пользовательское время в браузере для проверки разницы во времени между клиентом и сервером
  • Могу ли я получить часовой пояс браузера в ASP.NET или мне нужно полагаться на операции JS для извлечения информации?
  • Как конвертировать дату с одного часового пояса в другой часовой пояс
  • Interesting Posts

    Java 9: ​​модуль java.xml.bind недоступен в Eclipse

    Java ArrayList – как я могу определить, равны ли два списка, порядок не имеет значения?

    Когда мы должны использовать конструкторы копирования?

    Совместное использование сеансов между приложениями с использованием службы состояния сеанса ASP.NET

    Как создать список с флажками в Java Swing?

    Комбинация клавиш для минимизации удаленного рабочего стола

    Акриловые DNS-хосты не обновляются

    Найти прикрепленные / связанные события элемента с помощью инструментов разработки Chrome / Firebug / IE

    Какова цель использования нескольких флагов «arch» в компиляторе NVCC Nvidia?

    Используйте переменную окружения, чтобы указать на программу «Открыть с»

    Параметр в подобном разделе JPQL

    Перенаправление портов после NAT класса несущей?

    Как я могу уменьшить код привязки RadioButton?

    Прерывистый «сброс соединения» проблема просмотра веб-сайтов дома

    Не удается выполнить авторизацию в Gmail smtp через MailMessage & smtpClient

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