Преобразование дат UTC в другие часовые пояса - PullRequest
32 голосов
/ 22 мая 2011

Я конвертирую время 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.

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

Ответы [ 5 ]

68 голосов
/ 23 мая 2011

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

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

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);
14 голосов
/ 06 июня 2011

Преобразование строки даты в формате «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;
}
3 голосов
/ 17 ноября 2017

Следующий код прекрасно работает для меня, чтобы изменить дату с одного 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;
}
2 голосов
/ 28 июля 2017

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

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;
}
2 голосов
/ 22 мая 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...