Joda时间没有正确解析月份

时间:2014-04-19 11:57:29

标签: java parsing date time jodatime

我有这个简单的代码:

DateTimeFormatter format = DateTimeFormat.forPattern("YYYY MM DD");
DateTime dateTime;

String buffer = "2013 01 01";
dateTime = format.parseDateTime(buffer);
System.out.println(dateTime.getMonthOfYear());

buffer = "2013 02 01";
dateTime = format.parseDateTime(buffer);
System.out.println(dateTime.getMonthOfYear());

输出是: 1 1

但我希望: 1 2

......问题出在哪里?我不需要获得一年中的月份,但我确定dayOfWeek有问题,因为dateTime始终是1月而不是其他月份。

2 个答案:

答案 0 :(得分:6)

@LuS给出的解决方案是正确的。我发送了解释

在你的情况下,符号Y(JodaTime中的年代)或y(预感等年)之间的选择并不那么重要,因为在我们的现代,两年都有相同的数字。符号M是正确的(对于每年的月份)。因此,让我们专注于DD与dd。

解决方案' d'之所以有效,是因为年/月/日的组合使解析器能够计算日历日期(平凡)。如果缺少日期,那么解析器就不能再使用年和月来构建日期。

那么什么是D?它是一年中的日期。由于要解析的字符串的相应数字部分在两种情况下都是" 01",解析器将日期构造为 ISO-Ordinal-年份和年份的日期(两个示例中都相同),忽略(不同的)月份部分。

当然,解析后的结果" 2013-001" =" 2013-01-01"不适合输入" 2013 02 01",所以在严格的解析中,这应该失败。不幸的是,即使在严格模式下(使用org.joda.time.chrono.StrictChronology测试),JodaTime也不会尝试检查解析信息的一致性。

答案 1 :(得分:3)

如果我了解你需要检查你的模式:

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

,其中

y       year
d       day of month