4

我想了解两个 Java Date 对象之间的区别。我用过 Joda-Time 库。但问题是我得到的天数差异大于实际天数的差异。

这是我的代码片段:

DateFormat formatter = new SimpleDateFormat("mm/dd/yyyy");

Date someDate=new Date();
Date today = Calendar.getInstance().getTime();

try     {
    someDate = formatter.parse("06/22/2010");
}
catch(ParseException pe)    {
    System.out.println("Parser Exception");
}

int days = Days.daysBetween(new DateTime(someDate), new DateTime(today)).getDays();

System.out.println(" Days Between " + someDate + " : " + today + " - " + days);

这是我的输出:

 Days Between Fri Jan 22 00:06:00 IST 2010 : Sun Jul 25 19:27:01 IST 2010 - 184

在这里,为什么将“06/22/2010”作为 1 月 22 日?有没有人面临类似的问题?

帮助我的朋友.. 提前谢谢..

4

5 回答 5

19

似乎是mm指分钟,而不是月,即MM. 请在此处查看合适的字母列表:)

于 2010-07-25T14:13:09.300 回答
12

月份是MM

在你的情况下:

DateFormat formatter = new SimpleDateFormat(" MM /dd/yyyy");

于 2010-07-25T14:11:29.943 回答
4

你的图案有点瑕疵。mm被解析为minutes in hour,你正在寻找MM哪个是一年中的一个月

于 2010-07-25T14:13:05.133 回答
3

mm => 分钟,而不是几个月——你需要几个月的 MM——这将解决你的 Jan 问题!

于 2010-07-25T14:12:02.717 回答
2

其他答案正确解决了您的具体问题。

LocalDate

但还有一个更大的解决方案。如果您只从日期开始,没有时间和时区,那么您应该使用LocalDate类而不是DateTime.

时区

您的代码忽略了时区的关键问题。在尝试确定“今天”时,时区甚至对于 LocalDate 也很重要。你想今天在蒙特利尔还是在巴黎约会。新的一天在巴黎更早地黎明。当您省略时区时,您将获得 JVM 当前的默认时区。

Joda-Time 可以解析

此外,让 Joda-Time 进行解析。根本不需要使用 java.util.Date & .Calendar。Joda-time 的格式化字符与 java.util.Date 几乎相同,但不完全一样,请务必查阅文档。在这种情况下,它是相同的。

DateTimeFormatter formatter = DateTimeFormat.forPattern( "MM/dd/yyyy" );
LocalDate past = formatter.parseLocalDate( "06/22/2010" );
DateTimeZone = DateTimeZone.forID( "America/Montreal" ): // match time zone intended for that input string.
int days = Days.daysBetween( past, LocalDate.now( timeZone ) );
于 2014-08-17T06:04:15.777 回答