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

标签 android simpledateformat ormlite

我注意到 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

关于android - 解析日期在不同的 Android 版本上有不同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29561759/

相关文章:

java - ORMLite createOrUpdate() 记录同时保留特定列?

android - 获取 Android 默认编辑文本首选项对话框布局

android - 谷歌地图有 onZoomLevelChange() 或类似的吗?

java - 复选框 true/false 表示 ischecked 工作,但不显示 ui 复选标记

java - 如何将 "2014-08-10T06:34:04-0500"转换为 SimpleDateFormat

java - OrmLite:Dao.callBatchTasks() 和 TransactionManager.callInTransaction() 之间的区别

android - 在 Android 7.0 中触摸时微调器滚动到默认选择

java - 获取正确的月份格式日期java

java - 从字符串转换为日期后如何获得正确的日期

android - 如何在 android 中使用 ProGuard 和 OrmLite