如何用joda时间解析“YYYY-MM-DD”

时间:2013-10-03 18:11:02

标签: date jodatime

我正在尝试使用joda-time来解析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列出的日期格式之一。

3 个答案:

答案 0 :(得分: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格式。

答案 1 :(得分:4)

您的回答是在文档中:http://www.joda.org/joda-time/apidocs/org/joda/time/format/DateTimeFormat.html

字符串格式应该类似于:“yyyy-MM-dd”。

答案 2 :(得分:3)

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

更具体地说,在DateTimeFormat中,模式DD适用于Day in year,因此DD的{​​{1}}的值是一年中的第30天,即。 1月30日。格式化程序在阅读您的日期30时,会将月份设置为String。当它读取一年中的某一天时,它将在1月份用07覆盖该日期。

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

DateTimeFormat