Преобразование 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"));
Ответы
Ответ 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