将UTC转换为当前的区域设置时间

时间:2011-05-18 18:15:50

标签: java android utc

我正在从webservice下载一些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 个答案:

答案 0 :(得分:88)

它有一个设定的时区方法:

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

全部完成!

答案 1 :(得分:17)

所以你想通知UTC时区的SimpleDateFormat:

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 :(得分: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){
}

答案 3 :(得分:2)

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);
}

干杯!

答案 4 :(得分:2)

<强> 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中运行的其他程序在我们的脚下更改。

在Android上使用java.time

我答应你有外在的依赖。要在Android上使用上述内容,您需要ThreeTenABP,Android版的ThreeTen Backport,JSR-310到Java 6和7的后端。如何解决它在this question: How to use ThreeTenABP in Android Project中得到了很好的解释。

答案 5 :(得分:0)

从UTC中的纪元0起,Date对象始终是一个几毫秒的包装器。它绝不代表当地时间。

这意味着您需要创建第二个SimpleDateFormatter,它创建一个本地时间的显示字符串。

编辑:@Op。请注意,Android上日期/时间格式的优先级为java.text.DateFormat

答案 6 :(得分:0)

如果你有一个时间戳(长)作为输入(对于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)}")