当前位置: 首页 > 面试题库 >

Android上的SimpleDateFormat时区错误

卫博雅
2023-03-14
问题内容

我一直在尝试隔离应用程序中的错误。我成功产生了以下“谜语”:

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

在Android API 7上 运行此代码时,我得到了注释中的值(是的,是的)。此行为取决于特定的Java实现。

我的问题是:

  • 为什么s1不等于s2?
  • 更重要的是, 为什么s1不正确? 虽然s2指向适当的时间点,s1但没有。Android的SimpleDateFormat实现中似乎存在一个错误。

问题1 的答案 请参阅BalusC的答案:

  • [使用之后SimpleDateFormat#parse]可能需要恢复以前通过调用setTimeZone设置的任何TimeZone值,以进行进一步的操作。

问题2 的答案 参见wrygiel(我自己)的答案。

  • 这是由于Android 2.1(API 7)中的错误所致。

问题答案:

这在javadoc中提到DateFormat#parse()

根据给定的解析位置解析日期/时间字符串。例如,一个时间文本"07/10/96 4:5 PM, PDT"将被解析为一个等效于的日期Date(837039900000L)

默认情况下,解析是宽松的:如果输入的格式不是此对象的format方法使用的格式,但仍可以将其解析为日期,则解析成功。客户可以通过致电坚持严格遵守该格式setLenient(false)

此解析操作使用calendar生成一个Date。结果,取决于子类的实现,calendar's日期时间字段和TimeZone值可能已被覆盖。TimeZone先前已通过调用设置的任何值setTimeZone可能需要恢复以进行进一步的操作。

注意最后一段。遗憾的是它并不能解释 的时候 正是这一点会发生。要解决您的特定问题,您需要在格式化操作之前明确设置所需的时区。

关于SimpleDateFormat其自身的可变性,这已经有很多年了。您永远不应将其实例创建并分配为静态或类变量,而应始终将其作为方法(线程局部变量)。



 类似资料:
  • 我想解析这个字符串:Thu Jan 01 00:00:58 CET 1970 堆栈跟踪: java.text.ParseException:不可解析的日期:“Thu Jan 01 00:01:18 CET 1970”(偏移量20处)w/system.err:at java.text.DateFormat.Parse(DateFormat.java:571) 系统环境:android studio

  • 我的需求基本上是,我需要从字符串输入创建一个日期对象,但时区应该保持UTC。

  • 问题内容: 我不需要整个故事来澄清我的问题,所以我只显示代码(仅是示例)。我的结果怎么会有差异? 码 输出量 问题答案: 如果您在伦敦或巴黎,则时区为1970年1月1日GMT + 1。 由于@ARC在评论中解释的原因,英国于1968年2月18日至1971年10月31日使用了GMT + 1或UTC + 1 我可以转换很长时间而不会干扰任何时区吗? 将TimeZone设置为GMT。 版画

  • 我试图用android的JodaTime库解析ISO格式的日期,但得到了错误的时区偏移量。 我的默认时区是“欧洲/莫斯科”,但结果是“1990-05-04T00:00:00.000 0400”,而它应该是“1990-05-03T23:00:00.000 0300”。Android版本是KitKat。 我做错了什么?

  • 问题内容: 码: 输出: 请注意,将格式正确设置为GMT,但是丢失了GMT详细信息。我知道我可以使用并解决此问题,但是造成这种现象的原因是什么? 这是一个重复的问题,没有任何答案。 编辑:让我以另一种方式提出问题,什么是检索Date对象的方式,使其始终在GMT中? 问题答案: 我需要的是: 输出:有点可疑,但我只希望日期保持一致

  • 第二个选项(来自Java SimpleDateFormat(“yyyy-mm-dd't'hh:mm:ss'z'”)将时区作为IST提供) 在这两种情况下,时间都错了。我的笔记本电脑或手机显示的不是当地时间,但输出时间是提前2小时。我怎么才能改变呢?我想有柏林(CEST)的当前时间也显示在我的电脑上。我感谢每一个评论。