解析日期在不同 Android 版本上有不同的值
Parsing date has different values on different Android versions
我注意到 Android 的 SimpleDateFormat
在 Android 4.x 和 5.0 之间读取格式化程序的毫秒数存在差异。
String dateString = "2012-10-01 00:00:00.000087";
// ORMLite date format as seen at https://github.com/j256/ormlite-core/blob/master/src/main/java/com/j256/ormlite/field/types/BaseDateType.java
SimpleDateFormat formatForDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSS");
try{
Date parsedDate = formatForDate.parse(dateString);
// Android 5.0 parsedDate.getTime() ends in 000
// Android 4.x parsedDate.getTime() ends in 087 as expected
}
catch (ParseException e) {
e.printStackTrace();
}
如评论中所述,当 运行 以上代码在 android 4.x 上时,我得到的结果与在 Android 5.0 上的结果不同。它似乎丢弃了 Android 5 的 MS 字段。
(当我将格式更改为以 .SSS
结尾并将值更改为删除额外的零以仅 087
时,日期在 Android 5.0 上被正确解析。这是这不是一个很好的解决方法,因为我所有的数据库字段都以 SSSSSS
格式保存,这是 ORMLite 的默认格式。)
我似乎找不到 Google 在 SimpleDateFormat
代码中所做的更改。什么会导致这样的问题?我可以在哪里寻找修复程序?
根据 Java 1.5 或更新版本,你是正确的:
For parsing, the number of pattern letters is ignored unless it's needed to separate two adjacent fields.
但是,根据Android documentation,S是右补的,解析的长度不被忽略,因此“SSSSSS”表示微秒(或忽略右边三位的毫秒)和Android 5.0 实现是正确的。
编辑:限制和IllegalArgumentException
不适用于S
基本上 SSS 以毫秒为单位,SSSSSS 未定义,因此行为也未定义。
http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html
S 毫秒数
所以在任何情况下,您拥有的数据都是毫秒,但错误地表示为微秒,您需要将其解析回毫秒以获得正确的时间。
我注意到 Android 的 SimpleDateFormat
在 Android 4.x 和 5.0 之间读取格式化程序的毫秒数存在差异。
String dateString = "2012-10-01 00:00:00.000087";
// ORMLite date format as seen at https://github.com/j256/ormlite-core/blob/master/src/main/java/com/j256/ormlite/field/types/BaseDateType.java
SimpleDateFormat formatForDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSS");
try{
Date parsedDate = formatForDate.parse(dateString);
// Android 5.0 parsedDate.getTime() ends in 000
// Android 4.x parsedDate.getTime() ends in 087 as expected
}
catch (ParseException e) {
e.printStackTrace();
}
如评论中所述,当 运行 以上代码在 android 4.x 上时,我得到的结果与在 Android 5.0 上的结果不同。它似乎丢弃了 Android 5 的 MS 字段。
(当我将格式更改为以 .SSS
结尾并将值更改为删除额外的零以仅 087
时,日期在 Android 5.0 上被正确解析。这是这不是一个很好的解决方法,因为我所有的数据库字段都以 SSSSSS
格式保存,这是 ORMLite 的默认格式。)
我似乎找不到 Google 在 SimpleDateFormat
代码中所做的更改。什么会导致这样的问题?我可以在哪里寻找修复程序?
根据 Java 1.5 或更新版本,你是正确的:
For parsing, the number of pattern letters is ignored unless it's needed to separate two adjacent fields.
但是,根据Android documentation,S是右补的,解析的长度不被忽略,因此“SSSSSS”表示微秒(或忽略右边三位的毫秒)和Android 5.0 实现是正确的。
编辑:限制和IllegalArgumentException
不适用于S
基本上 SSS 以毫秒为单位,SSSSSS 未定义,因此行为也未定义。
http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html S 毫秒数
所以在任何情况下,您拥有的数据都是毫秒,但错误地表示为微秒,您需要将其解析回毫秒以获得正确的时间。