我注意到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这个?我可以在哪里寻找解决方案?
答案 0 :(得分:2)
根据Java 1.5或更新版本,你是对的:
对于解析,除非需要分隔两个相邻的字段,否则将忽略模式字母的数量。
但是,根据Android documentation,S是右边填充的,并且不会忽略解析的长度,因此“SSSSSS”表示微秒(或右边忽略三位数的毫秒),Android 5.0实现是纠正一个。
修改:限制和IllegalArgumentException
不适用于S
答案 1 :(得分:0)
基本上SSS是毫秒,SSSSSS是未定义的,因此也没有定义行为。
http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html S毫秒数
因此,无论如何,您拥有的数据是毫秒,但错误地表示为微秒,您需要将其解析回millis以获得正确的时间。