2013-10-03 48 views
4

我试图使用乔达时间来解析日期字符串的形式YYYY-MM-DD。我有测试这样的代码:如何解析“YYYY-MM-DD”与乔达时间

DateTimeFormatter dateDecoder = DateTimeFormat.forPattern("YYYY-MM-DD"); 
DateTime dateTime = dateDecoder.parseDateTime("2005-07-30"); 

System.out.println(dateTime); 

,输出:

2005-01-30T00:00:00.000Z 

正如你所看到的,所产生的DateTime对象是30 Jan 2005,而不是30 July 2005

感谢任何帮助。我只是认为这将工作,因为它是列出的日期格式之一here

回答

4

你的答案是在文档:http://www.joda.org/joda-time/apidocs/org/joda/time/format/DateTimeFormat.html

字符串格式应该是这样的: “YYYY-MM-DD”。

+0

谢谢吉姆。我应该说我曾尝试SimpleDateFormat风格日期,并可以看到它对这些工作正常。我只是认为,自从乔达时间文档声明它支持ISO8601格式的日期,那么我认为它会支持它们。别担心......我会找出别的东西。谢谢。 –

5

混淆与ISO格式实际是什么。 YYYY-MM-DD不是ISO格式,实际结果日期是。

所以2005-07-30为 ISO-8601格式,并规范使用YYYY-MM-DD描述格式。在使用YYYY-MM-DD作为规范中的模式和任何代码段之间没有关系。规范的唯一限制是结果包含4位数的年份,后面跟着一个2位数的月份,后面跟着一个破折号,后面跟着两位数的月份。

因此,该规格可能已经使用$year4-$month2-$day2,这同样很好定义的输出格式。

您将需要搜索并替换任何输入模式以将“Y”转换为“y”并将“D”转换为“d”。

我还增加了一些增强的格式化documentation

+0

谢谢斯蒂芬。 –

3

the w3 document和JodaTime的DateTimeFormat中描述的日期格式是不同的。

更具体地说,在DateTimeFormat,模式DDDay in year,因此对于30DD值是30天的,即每年。 1月30日。格式化程序正在读取日期String时,它将月份设置为07。当它读取每年的日期时,它将覆盖1月份的01

您需要使用DateTimeFormat预期的模式字符串,而不是w3 dat和时间格式所期望的模式字符串。在这种情况下,那将是

DateTimeFormatter dateDecoder = DateTimeFormat.forPattern("yyyy-MM-dd");