2013-02-11 38 views
3

我需要一个字符串解析为Joda-TimeDateTime(或者是java.util.Date)这是我得到的字符串的示例:时区关在乔达时间10小时

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" 

所以我PA解析出'T':

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

并再次尝试。这一次也不例外,但是,时间段为关:

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

注意区别:在原来的字符串时区为“-0800”,在这里它是“+02:00”。这又会改变整个日期,现在是一天之后。

我在做什么错?

+0

你注意到日期也完全关闭吗? – nhahtdh 2013-02-11 15:21:02

+0

感谢您的回复,nhahtdh。这会产生一个异常:java.lang.IllegalArgumentException:非法模式组件:T – Eddy 2013-02-11 15:41:54

+0

我注意到日期字符串是关闭的吗?你的意思是,2013-01-27T04:03:20-0800?是的,但这是我必须合作的。 – Eddy 2013-02-11 15:42:56

回答

5

调用DateTimeFormatter对象上的方法withOffsetParsed以获得一个DateTimeFormatter,该值保持时区从String中解析,而不是将其偏移到本地时区。

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

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

+0

是的,就是这样。谢谢!顺便说一句,我注意到'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 2013-02-11 16:34:13

+0

@Eddy:不知道。可能是某种默认符号(?)。您可能需要使用格式化程序输出日期。 – nhahtdh 2013-02-11 16:35:20

+0

关于'T',DateTime是**不是**字符串,也不包含字符串。 [DateTimeFormatter](http://www.joda.org/joda-time/apidocs/org/joda/time/format/DateTimeFormatter.html)实例可以*生成日期,时间和时区的字符串表示存储在DateTime中的信息。当您调用DateTime上的'toString'方法([隐式或显式](http://stackoverflow.com/q/328661/642706))时,基于[ISO 8601](https:/ /en.wikipedia.org/wiki/ISO_8601)会自动使用。该格式化程序使用'YYYY-MM-DDTHH:MM:SS.ssssss + 00:00'格式。 – 2014-02-09 09:56:07