当修改系统时间显示格式,从12小时制修改为24小时制,使用new SimpleDateFormat("hh:mm", Locale.getDefault(Locale.Category.FORMAT)).format(date)
或new SimpleDateFormat("HH:MM", Locale.getDefault(Locale.Category.FORMAT)).format(date)
,解析同一个时间戳数值的时候会发生错误,时间不准。
例如定义一个时间数据。 private String time = "1591148797690";
//这是个时间戳数据的string
系统时间显示设置为12小时制的时候(此时使用 new SimpleDateFormat("hh:mm", Locale.getDefault(Locale.Category.FORMAT)).format(new Date(Long.parseLong(time)))
)结果为9:46
。这是准确的时间,但是手动将时间显示调制24小时制后,使用 new SimpleDateFormat("HH:MM", Locale.getDefault(Locale.Category.FORMAT)).format(new Date(Long.parseLong(time)))
,结果为09:06
。这个时间是有问题的。
//HH:MM表示24小时制时间,hh:mm表示12小时制时间。
出处:时间系列之各种时间的意义
1970年的1月1日(GMT或UTC时间),这一天是计算机的创世纪之日,用小说里面的话说:这天是一个新的纪元的开始。Unix时间戳就是从那天起到现在的秒数。
当解析同一个时间戳时间的时候出现了不同的结果,显然问题出在SimpleDateFormat的使用。
原本的思路是使用
if (android.text.format.DateFormat.is24HourFormat(mContext))
判断系统是使用12小时制还是24小时制,再去判断使用HH:MM或hh:mm去进行数据转换。但是new SimpleDateFormat
使用无论如何还是存在问题时间转换不准的问题。
最后发现如果使用 SimpleDateFormat.getTimeInstance().format(date)
则不会有此问题。
但是这样格式跟之前不一致,会多个秒,例如24小时制时结果为09:46:37
。getTimeInstance()
的参数选DateFormat.SHORT
即可。
即调用SimpleDateFormat.getTimeInstance(DateFormat.SHORT).format(date)
。或者DateFormat.getTimeInstance(DateFormat.SHORT).format(date)
也可以。SimpleDateFormat
继承自DateFormat
。
这里还有一个问题,12小时制的时候会多个AM
或PM
,调用getTimeInstance(DateFormat.SHORT)
后结果为9:46 AM
,如果非得要求显示9:46
的话,可以调用substring去处理数据。
private String mString12 = "9:46 AM";
if (mString12.contains("M")){
String substring = mString12.substring(0, mString12.indexOf("M")-2);
Log.d("MainActivity","substring = " + substring);
}
log如下:
D/MainActivity: substring = 9:46
总结:使用SimpleDateFormat
的时候,应尽量使用getXXXInstance
去调用,而不是new SimpleDateFormat
,getXXXInstance
更安全。
参考链接:
时间系列之各种时间的意义
深入理解Java:SimpleDateFormat安全的时间格式化
Java中Long、String、Date 类型之间的转换
Java中的DateFormat用法举例
网友评论