Java + Joda Time两个日期之间的一周

时间:2012-03-03 04:02:41

标签: java jodatime

我希望获得Java中两个日期范围之间的周数和月数。例如, 开课日期:03/01/2012 截止日期:03/05/2012

由于这两个日期分为两个不同的星期,我希望结果为2而不是0.

问题的第二部分是: 开课日期:02/29/2012 截止日期:03/01/2012

介于两者之间的月数应为2.

我一直在网上搜索这个,很多人都推荐在Java中使用Joda Date time。所以我试了一下。我能够让这几周工作,但我不确定这是否正确。以下是我为了获得一周的持续时间而做的事情:

    DateTime s = new DateTime(Long.parseLong("1330573027000")); // 2012-02-29
    DateTime e = new DateTime(Long.parseLong("1331005027000")); // 2012-03-05   

    Weeks weeks = Weeks.weeksBetween(s, e).plus(1);

当我期待2时,返回1,因为两个日期在不同的星期。

几个月的持续时间我试着遵循相同但它返回0但我希望它返回2,因为这两个日期是在两个不同的月份。

有人可以指点我正确的方向吗?

谢谢!

修改 我想我有一种方法可以做到,请告诉我它是否正确:

    DateTime start = new DateTime(Long.parseLong("1330659427000"));
    DateTime start = new DateTime(Long.parseLong("1331005027000"));

    DateTime finalStart = start.dayOfWeek().withMinimumValue();
    DateTime finalEnd   = end.dayOfWeek().withMaximumValue();

然后获得finalStart和finalEnd之间的区别。这看起来是否正确?

EDIT2 更新了结束时间

2 个答案:

答案 0 :(得分:6)

JodaTime Weeks.weeksBetween(s,e)仅返回整周计数。不完整的周数不计算在内。要解决此问题,您必须保证日期在开始时和结束时。 试试这个:

int weeks = Weeks.weeksBetween(s.dayOfWeek().withMinimumValue().minusDays(1), 
            e.dayOfWeek().withMaximumValue().plusDays(1)).getWeeks();

minusDays / plusDays将保证我试图计算的周数已满。

相同的逻辑适用于月份:

int months = Months.monthsBetween(s.dayOfMonth().withMinimumValue().minusDays(1),
             e.dayOfMonth().withMaximumValue().plusDays(1)).getMonths();

答案 1 :(得分:0)

    int OFFSET_ONE = 1;

    DateTime t1 = new DateTime().withDate(2012, 02, 29).withDayOfWeek(1);
    DateTime t2 = new DateTime().withDate(2012, 03, 05).withDayOfWeek(7);

    int week1 = t2.weekOfWeekyear().get(); 
    int week2 = t1.weekOfWeekyear().get();

    System.out.println(week1-week2+OFFSET_ONE); // add OFFSET_ONE

它能给你所追求的目标吗?