Вопрос:

Java: Как вы конвертируете метку времени UTC в местное время?

java api date calendar timezone

75080 просмотра

3 ответа

1961 Репутация автора

У меня есть временная метка, которая находится в UTC, и я хочу преобразовать ее в местное время, не используя вызов API, как TimeZone.getTimeZone("PST"). Как именно вы должны это сделать? Я использовал следующий код без особого успеха:

private static final SimpleDateFormat mSegmentStartTimeFormatter = new        SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");

Calendar calendar = Calendar.getInstance();

    try {
        calendar.setTime(mSegmentStartTimeFormatter.parse(startTime));
    }
    catch (ParseException e) {
        e.printStackTrace();
    }

    return calendar.getTimeInMillis();

Пример входного значения: [2012-08-15T22:56:02.038Z]

должен вернуть эквивалент [2012-08-15T15:56:02.038Z]

Автор: Android Noob Источник Размещён: 19.09.2012 12:51

Ответы (3)


54 плюса

33923 Репутация автора

Решение

Dateне имеет часовых поясов и магазинов внутри UTC. Только когда дата отформатирована, применяется коррекция часового пояса. Когда используется a DateFormat, по умолчанию используется часовой пояс JVM, в которой он работает. Используйте setTimeZoneдля его изменения по мере необходимости.

DateFormat utcFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
utcFormat.setTimeZone(TimeZone.getTimeZone("UTC"));

Date date = utcFormat.parse("2012-08-15T22:56:02.038Z");

DateFormat pstFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
pstFormat.setTimeZone(TimeZone.getTimeZone("PST"));

System.out.println(pstFormat.format(date));

Это печатает 2012-08-15T15:56:02.038

Обратите внимание, что я пропустил 'Z'в формате PST, поскольку это указывает на UTC. Если вы просто пошли с, Zто результат будет2012-08-15T15:56:02.038-0700

Автор: Steve Kuo Размещён: 19.09.2012 01:12

-1 плюса

1616 Репутация автора

Вот простое модифицированное решение

    public String convertToCurrentTimeZone(String Date) {
            String converted_date = "";
            try {

                DateFormat utcFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                utcFormat.setTimeZone(TimeZone.getTimeZone("UTC"));

                Date date = utcFormat.parse(Date);

                DateFormat currentTFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                currentTFormat.setTimeZone(TimeZone.getTimeZone(getCurrentTimeZone()));

                converted_date =  currentTFormat.format(date);
            }catch (Exception e){ e.printStackTrace();}

            return converted_date;
    }


    //get the current time zone

    public String getCurrentTimeZone(){
            TimeZone tz = Calendar.getInstance().getTimeZone();
            System.out.println(tz.getDisplayName());
            return tz.getID();
    }
Автор: Sathya Baman Размещён: 08.05.2017 06:05

14 плюса

41238 Репутация автора

Используйте современный Java date & time API, и это просто:

    String inputValue = "2012-08-15T22:56:02.038Z";
    Instant timestamp = Instant.parse(inputValue);
    ZonedDateTime losAngelesTime = timestamp.atZone(ZoneId.of("America/Los_Angeles"));
    System.out.println(losAngelesTime);

Это печатает

2012-08-15T15:56:02.038-07:00[America/Los_Angeles]

Примечания к сведению:

  • В ваших ожиданиях есть небольшая ошибка. В Zвашей временной метке указано UTC, также известное как зулусское время. Так что в вашем местном значении времени, там Zне должно быть. Скорее вы захотите получить возвращаемое значение, как, например 2012-08-15T15:56:02.038-07:00, так как смещение теперь составляет -7 часов, а не Z.
  • Избегайте трехбуквенных сокращений часовых поясов. Они не стандартизированы и поэтому чаще всего неоднозначны. PST, например, может означать стандартное время Philppine, стандартное тихоокеанское время или стандартное время на Питкэрне (хотя S в сокращении часто относится к летнему времени (имеется в виду летнее время)). Если вы запланировали стандартное тихоокеанское время, то это даже не часовой пояс, поскольку летом (где указывается временная метка) вместо этого используется тихоокеанское летнее время. Вместо сокращений используйте идентификаторы часовых поясов в формате регион / город, как в моем коде.
  • Временные метки обычно лучше всего обрабатывать как Instantобъекты. Конвертировать ZonedDateTimeтолько тогда, когда у вас есть необходимость, например, для презентации.

Вопрос: Могу ли я использовать современный API с моей версией Java?

Если вы используете хотя бы Java 6 , вы можете.

  • В Java 8 и более поздних версиях новый API поставляется встроенным.
  • В Java 6 и 7 получают ThreeTen Backport , бэкпорт новых классов (это ThreeTen для JSR-310, где впервые был определен современный API).
  • На Android используйте Android-версию ThreeTen Backport. Он называется ThreeTenABP, и я думаю, что в этом вопросе есть замечательное объяснение : как использовать ThreeTenABP в Android Project .
Автор: Ole V.V. Размещён: 02.09.2017 06:33
Вопросы из категории :
32x32