Android如何解析API返回的/Date(1543469400000)/格式日期时间数据
/Date(毫秒数)/ 格式日期解析方案
这类/Date(xxxxxxxxxxxxx)/格式是ASP.NET AJAX框架默认的JSON日期序列化规则,括号内的核心内容是UTC 1970-01-01 00:00:00起算的毫秒级时间戳,部分返回值会在毫秒数后追加时区偏移值,例如/Date(1543469400000+0800)/。
手动解析步骤
- 提取核心时间字段:裁掉固定前缀
/Date(和后缀)/,拿到括号内的完整字符串 - 过滤非时间戳字符:从括号内的字符串中提取开头的纯数字(可能带负号)部分,丢弃后面的时区偏移后缀,转成Long类型的毫秒值
- 构造日期对象:用拿到的毫秒值直接生成Date实例,再按需格式化输出为目标时间字符串
参考实现代码(Kotlin):
// 原始接口返回的时间字段值 val rawArrivalTime = "/Date(1543469400000)/" // 提取毫秒值 val contentInBracket = rawArrivalTime.substringAfter("(").substringBefore(")") val timeMillis = contentInBracket.takeWhile { it.isDigit() || it == '-' }.toLong() // 转成Date对象 val arrivalDate = Date(timeMillis) // 格式化为指定样式的时间字符串 val outputFormat = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()) val formattedArrivalTime = outputFormat.format(arrivalDate)
全局自动解析配置
如果项目用Gson做JSON解析,可以注册自定义日期反序列化器,所有该格式的Date字段会自动完成转换,无需每次手动处理:
class AspNetDateDeserializer : JsonDeserializer<Date> { override fun deserialize(json: JsonElement, typeOfT: Type, context: JsonDeserializationContext): Date { val rawStr = json.asString val bracketContent = rawStr.substringAfter("(").substringBefore(")") val millis = bracketContent.takeWhile { it.isDigit() || it == '-' }.toLong() return Date(millis) } } // 初始化Gson时注册适配器 val gson = GsonBuilder() .registerTypeAdapter(Date::class.java, AspNetDateDeserializer()) .create()
注意事项
- 不要用固定长度截取字符串提取时间戳,避免带时区偏移的返回值解析出错
- 格式化时间时注意按需配置时区,默认使用设备当前时区,如果接口要求UTC时间可以手动指定
TimeZone.getTimeZone("UTC") - Android 8.0及以上版本建议用
java.time包下的Instant、LocalDateTime替代老旧的Date和SimpleDateFormat,规避线程安全问题
内容的提问来源于stack exchange,提问作者Suraj D
相关产品推荐
相关产品推荐

