【问题标题】:Time Zone off by 10 hours in Joda-TimeJoda-Time 的时区关闭 10 小时
【发布时间】:2013-01-26 17:29:22
【问题描述】:

我需要将字符串解析为 Joda-Time DateTime(或 java.util.Date。)这是我得到的字符串的示例:

eventDateStr = 2013-02-07T16:05:54-0800

我正在使用的代码:

DateTimeFormatter presentation = DateTimeFormat.forPattern("yyyy-MM-dd kk:mm:ssZ");
DateTime eveDate = presentation.parseDateTime(eventDateStr);

上面抛出这个异常:

Invalid format: "2013-02-07T16:05:54-0800" is malformed at "T04:03:20-0800"

所以我正在从那里解析“T”:

eventDateStr = eventDateStr.indexOf("T") > 0 ? eventDateStr.replace("T", " ") : eventDateStr;

然后再试一次。这次也不例外,只是时区关闭:

2013-02-08T02:05:54.000+02:00

注意区别:在原始字符串中,时区是“-0800”,而这里是“+02:00”。这反过来又改变了整个日期,现在是一天后。

我做错了什么?

【问题讨论】:

  • 您是否注意到日期也完全关闭了?
  • 感谢您的回复,nhahtdh。这会产生一个异常:java.lang.IllegalArgumentException: Illegal pattern component: T
  • 我是否注意到日期字符串已关闭?你是说这个,2013-01-27T04:03:20-0800?是的,但这是我必须处理的。
  • 是的,抱歉,我没有正确复制和粘贴。我编辑了这个问题,所以现在它们反映了真正发生的事情。长话短说,我认为这一天并没有真正关闭,它只是被时区问题提前了 10 个小时,在我提出的示例中,将日期从 7 号推到 8 号。
  • 检查我的答案。我想它会解决你的问题。

标签: java datetime timezone jodatime datetime-format


【解决方案1】:

DateTimeFormatter 对象上调用withOffsetParsed 方法以获取DateTimeFormatter,该DateTimeFormatter 保持从字符串解析的时区,而不是将其偏移到本地时区。

关于为什么在打印出DateTime 时会显示TBasil Bourque 在下面的评论中有很好的解释。

关于TDateTime 不是字符串,也不包含字符串。 DateTimeFormatter 实例可以生成存储在DateTime 中的日期、时间和时区信息的字符串表示形式。当您在 DateTime (either implicitly or explicitly) 上调用 toString 方法时,将自动使用基于 ISO 8601 的内置格式化程序。该格式化程序使用YYYY-MM-DDTHH:MM:SS.ssssss+00:00 格式。

【讨论】:

  • 是的,就是这样。谢谢!顺便说一句,我注意到“T”在解析后又回来了。这是为什么?解析前,字符串对象:2013-02-08T09:21:34-0800。删除“T”后,字符串对象:2013-02-08 09:21:34-0800。解析后dateTime对象:2013-02-08T09:21:34.000-08:00
  • @Eddy:不知道。可能是某种默认符号(?)。您可能需要使用格式化程序来输出日期。
  • 关于T,日期时间不是字符串,也不包含字符串。 DateTimeFormatter 实例可以生成存储在 DateTime 中的日期、时间和时区信息的字符串表示形式。当您在 DateTime(implicitly or explicitly)上调用 toString 方法时,将自动使用基于 ISO 8601 的内置格式化程序。该格式化程序使用YYYY-MM-DDTHH:MM:SS.ssssss+00:00 格式。
猜你喜欢
  • 2012-07-22
  • 1970-01-01
  • 2013-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-19
  • 2018-05-18
  • 2013-09-20
相关资源
最近更新 更多