我正在从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"));
答案 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)}")