解析日期在不同 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 毫秒数

所以在任何情况下,您拥有的数据都是毫秒,但错误地表示为微秒,您需要将其解析回毫秒以获得正确的时间。