我一直试图在我的应用程序中隔离一个错误.我成功地制作了以下"谜语":
SimpleDateFormat f1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
SimpleDateFormat f2 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
Date d = f1.parse("2012-01-01T00:00:00+0700");
String s1 = f1.format(d); // 2011-12-31T18:00:00+0700
String s2 = f2.format(d); // 2011-12-31T18:00:00+0100
Run Code Online (Sandbox Code Playgroud)
当我在Android API 7上运行此代码时,我在注释中获得了值(是的,真的).此行为取决于特定的Java实现.
我的问题是:
s2指向一个适当的时间点,s1但没有.Android的SimpleDateFormat实现似乎存在一个错误.对问题1的回答:请参阅BalusC的答案:
SimpleDateFormat#parse]可能需要恢复先前通过调用setTimeZone设置的任何TimeZone值以进行进一步操作.对问题2的回答:请参阅wrygiel的答案(我自己).
这在javadoc中提到DateFormat#parse():
根据给定的解析位置解析日期/时间字符串.例如,时间文本
"07/10/96 4:5 PM, PDT"将被解析为相当于的DateDate(837039900000L).默认情况下,解析是宽松的:如果输入不是此对象的格式方法使用的形式,但仍可以解析为日期,则解析成功.客户可以通过致电坚持严格遵守格式
setLenient(false).此解析操作使用
calendar生成aDate.因此,calendar's日期时间字段和TimeZone值可能已被覆盖,具体取决于子类实现.TimeZone之前由呼叫设置的任何值setTimeZone可能需要恢复以进行进一步操作.
注意最后一段.遗憾的是,它没有解释何时会发生这种情况.要解决您的特定问题,您需要在格式化操作之前显式设置所需的时区.
至于其SimpleDateFormat自身的可变性,这已为人所知多年.您永远不应该创建它并将其实例指定为静态或类变量,而应始终作为方法(threadlocal)变量.
| 归档时间: |
|
| 查看次数: |
6720 次 |
| 最近记录: |