Конвертировать UTC в текущее время - PullRequest
36 голосов
/ 18 мая 2011

Я загружаю некоторые данные JSON из веб-службы. В этом JSON у меня есть некоторые значения даты / времени. Все в 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"));

Ответы [ 7 ]

88 голосов
/ 18 мая 2011

У него установлен метод часовых поясов:

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

все готово!

17 голосов
/ 18 мая 2011

Итак, вы хотите сообщить 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);
2 голосов
/ 16 ноября 2017

java.time

Я хотел бы предложить современный ответ.Большинство других ответов являются правильными и были хорошими ответами в 2011 году. Сегодня SimpleDateFormat давно устарел и всегда сопровождался некоторыми сюрпризами.И сегодня у нас намного лучше: java.time, также известный как JSR-310, современный Java-интерфейс даты и времени.Этот ответ предназначен для тех, кто принимает внешнюю зависимость (только до тех пор, пока 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, бэкпорт JSR-310 для Java 6 и 7. Как это сделать, подробно и подробно объяснено в этого вопроса: Как использоватьThreeTenABP в Android Project .

2 голосов
/ 03 августа 2016
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);
}

Ура!

2 голосов
/ 03 февраля 2016

Ваша строка 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){
}
0 голосов
/ 24 января 2018

Если вместо этого у вас была временная метка (Long) (для времени UTC), так как это на Android, вы можете сделать что-то вроде этого:

fun DateFormat.formatUtcEpochSecond(epochSecond: Long): String = format(CalendarEx.getFromEpochSecond(epochSecond).time)

fun DateFormat.formatUtcEpochMs(epochMilli: Long): String = format(CalendarEx.getFromEpochMilli(epochMilli).time)

CalendarEx.kt

object CalendarEx {

    @JvmStatic
    fun getFromEpochMilli(epochMilli: Long): Calendar {
        val cal = Calendar.getInstance()
        cal.timeInMillis = epochMilli
        return cal
    }

    @JvmStatic
    fun getFromEpochSecond(epochSecond: Long): Calendar {
        val cal = Calendar.getInstance()
        cal.timeInMillis = epochSecond * 1000L
        return cal
    }
}

DateHelper.kt

/**
 * gets the default date formatter of the device
 */
@JvmStatic
fun getFormatDateUsingDeviceSettings(context: Context): java.text.DateFormat {
    return DateFormat.getDateFormat(context) ?: SimpleDateFormat("yyyy/MM/dd", Locale.getDefault())
}

/**
 * gets the default time formatter of the device
 */
@JvmStatic
fun getFormatTimeUsingDeviceSettings(context: Context): java.text.DateFormat {
    return DateFormat.getTimeFormat(context) ?: SimpleDateFormat("HH:mm", Locale.getDefault())
}

Пример использования:

    val dateFormat = DateHelper.getFormatDateUsingDeviceSettings(this)
    val timeFormat = DateHelper.getFormatTimeUsingDeviceSettings(this)
    val timeStampSecondsInUtc = 1516797000L
    val localDateTime = Instant.ofEpochSecond(timeStampSecondsInUtc).atZone(ZoneId.ofOffset("UTC", ZoneOffset.ofHours(0))).toLocalDateTime()
    Log.d("AppLog", "input time in UTC:" + localDateTime)
    Log.d("AppLog", "formatted date and time in current config:${dateFormat.formatUtcEpochSecond(timeStampSecondsInUtc)} ${timeFormat.formatUtcEpochSecond(timeStampSecondsInUtc)}")
0 голосов
/ 18 мая 2011

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

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

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

...