解析日期在不同的Android版本上具有不同的值

我注意到
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代码中所做的更改.什么会导致问题lilke这个?我可以在哪里寻找解决方案?

最佳答案 根据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.

点赞