采用Gson封装Json数据与后台进行交互,Android端与后台接口通常对数据中的Date格式需要做统一处理,这样就能保证Gson正常解析。但在不同的jdk版本的环境中,这样处理也不能百分百保证没有问题,笔者在实践中就遇到这样的问题:后台的Gson解析方法只能接受12时制的时间格式,24时制的时间解析发生错误。
这是24时制,后台解析失败导致业务处理失败:
{"date":"Aug 20, 2017 03:50:30"}
这是12时制,后台可以正常解析:
{"date":"Aug 20, 2017 4:00:59 AM"}
思来想去,只要将Android端时间设置或转换成12时制的就行了,这样以最快的方法解决以上问题。时间转换就需要了解下SimpleDateFormat,SimpleDateFormat是一个以与语言环境有关的方式来格式化和解析日期的具体类。它允许进行格式化(日期 -> 文本)、解析(文本 -> 日期)和规范化。
日期和时间模式
字母 | 日期或时间元素 | 表示 | 示例 |
---|---|---|---|
G | Era | 标志符 | Text |
y | 年 | Year | 1996; 96 |
M | 年中的月份 | Month | July; Jul; 07 |
w | 年中的周数 | Number | 27 |
W | 月份中的周数 | Number | 2 |
D | 年中的天数 | Number | 189 |
d | 月份中的天数 | Number | 10 |
F | 月份中的星期 | Number | 2 |
E | 星期中的天数 | Text | Tuesday; Tue |
a | am/pm 标记 | Text | PM |
H | 一天中的小时数(0-23) | Number | 0 |
k | 一天中的小时数(1-24) | Number | 24 |
K | am/pm 中的小时数(0-11) | Number | 0 |
h | am/pm 中的小时数(1-12) | Number | 12 |
m | 小时中的分钟数 | Number | 30 |
s | 分钟中的秒数 | Number | 55 |
S | 毫秒数 | Number | 978 |
z | 时区 | General time zone | Pacific Standard Time; PST; GMT-08:00 |
Z | 时区 | RFC 822 time zone | -0800 |
时间格式转换代码如下:
GsonBuilder builder = new GsonBuilder();
Gson gson = builder.create();
String time = gson.toJson(new Date());
LogUtil.d("原格式时间",time);
//如果当前时24时制则进行格式转换
if(android.text.format.DateFormat.is24HourFormat(this)){
SimpleDateFormat dateFormat = new SimpleDateFormat("MMM d, yyyy h:mm:ss aa", Locale.ENGLISH);
String newTime = dateFormat.format(new Date());
LogUtil.d("新格式时间",newTime);
}
日志打印如下:
原格式时间: Aug 20, 2017 04:32:51
新格式时间: Aug 20, 2017 4:32:51 AM
代码中的Locale.ENGLISH可以设置时间的语言:中文/英语/法语...
时间格式转换成功,该问题解决完毕,有兴趣的朋友也可以采用String替换方法进行时间字符串拼接也是可以的。