Подтвердить что ты не робот

Преобразование UTC в текущее время локали

Я загружаю некоторые данные JSON из веб-службы. В этом JSON у меня есть некоторые значения Date/Time. Все в UTC. Как я могу проанализировать эту строку даты, чтобы объект Date результата находился в текущей локали?

Например: сервер вернул "2011-05-18 16:35:01", и мое устройство теперь должно отображать "2011-05-18 18:35:01" (GMT +2)

Мой текущий код:

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date myDate = simpleDateFormat.parse(rawQuestion.getString("AskDateTime"));
4b9b3361

Ответ 1

Он имеет заданный часовой пояс:

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
simpleDateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
Date myDate = simpleDateFormat.parse(rawQuestion.getString("AskDateTime"));

все сделано!

Ответ 2

Итак, вы хотите сообщить SimpleDateFormat часового пояса UTC:

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
TimeZone utcZone = TimeZone.getTimeZone("UTC");
simpleDateFormat.setTimeZone(utcZone);
Date myDate = simpleDateFormat.parse(rawQuestion.getString("AskDateTime"));

Для отображения:

simpleDateFormat.setTimeZone(TimeZone.getDefault());
String formattedDate = simpleDateFormat.format(myDate);

Ответ 3

Ваша строка myUTC = "2016-02-03T06: 41: 33.000Z"

SimpleDateFormat existingUTCFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
SimpleDateFormat requiredFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

try{
Date getDate = existingFormat.parse(myUTC);
String mydate = requiredFormat.format(getDate)
}
catch(ParseException){
}

Ответ 4

public static String toLocalDateString(String utcTimeStamp) {
    Date utcDate = new Date(utcTimeStamp);
    DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
    df.setTimeZone(TimeZone.getTimeZone("PST"));
    return df.format(utcDate);
}

Ура!

Ответ 5

java.time

Я хотел бы внести современный ответ. Большинство других ответов верны и были прекрасными ответами в 2011 году. Сегодня SimpleDateFormat давно устарел, и он всегда приносил некоторые сюрпризы. И сегодня у нас намного лучше: java.time, также известный как JSR-310, современный Java API дат и времени. Этот ответ предназначен для любого, кто принимает внешнюю зависимость (до тех пор, пока java.time не появится на вашем устройстве Android) или уже использует Java 8 или новее.

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss");
    String dateTimeFromServer = "2011-05-18 16:35:01";
    String localTimeToDisplay = LocalDateTime.parse(dateTimeFromServer, formatter)
            .atOffset(ZoneOffset.UTC)
            .atZoneSameInstant(ZoneId.of("Europe/Zurich"))
            .format(formatter);

Результатом этого фрагмента кода является запрос:

2011-05-18 18:35:01

Укажите явный часовой пояс, если вы можете

Я дал явный часовой пояс Европы/Цюриха. Пожалуйста, замените желаемый локальный часовой пояс. Чтобы использовать настройку часового пояса ваших устройств, используйте ZoneId.systemDefault(). Однако имейте в виду, что это хрупкое, потому что оно требует настройки часового пояса из JVM, и этот параметр может быть изменен под ногами другими частями вашей программы или другими программами, работающими в одной JVM.

Использование java.time на Android

Я обещал вам внешнюю зависимость. Для использования вышеперечисленного на Android вам понадобится ThreeTenABP, версия Android ThreeTen Backport, backport JSR-310 для Java 6 и 7. Как это сделать, это хорошо и подробно объяснено в этот вопрос: как использовать ThreeTenABP в проекте Android.

Ответ 6

Объект Date всегда является оберткой вокруг миллисекунд с эпохи 0 в формате UTC. Он никогда не представляет локального времени.

Это означает, что вам нужно создать второй SimpleDateFormatter, который создает строку отображения, которая находится по местному времени.

Изменить: @Op. Обратите внимание, что предпочтительный класс для форматирования даты и времени на Android - java.text.DateFormat