【问题标题】:Week between two dates Java + Joda Time两个日期之间的星期 Java + Joda Time
【发布时间】:2014-06-17 21:33:28
【问题描述】:

我想获取 Java 中两个日期范围之间的周数和月数。例如, 开始日期:03/01/2012 结束日期:03/05/2012

由于这两个日期在两个不同的周内,我希望结果为 2 而不是 0。

问题的第二部分是: 开始日期:2012 年 2 月 29 日 结束日期:03/01/2012

中间的月数应为 2。

我一直在网上搜索这方面的内容,很多人建议在 Java 中使用 Joda Date 时间。所以我试了一下。我能够让几周的工作,但我不确定这是否是正确的方法。这是我为获得一周持续时间所做的工作:

    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);

这返回 1,而我期待 2,因为两个日期在不同的周。

对于几个月的持续时间,我尝试遵循相同的方法,但它返回 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的区别。这看起来正确吗?

编辑2 更新结束时间

【问题讨论】:

  • 两个不同的星期?如果日期是2012-02-292012-12-29,满足两个不同的星期怎么办?你也在看 answer=2 吗?
  • 不,在您列出的方案中,它应该计算两个日期范围之间的周数。所以我基本上想要做的是获取开始日期一周的第一天和结束日期一周的最后一天之间的持续时间。这样我会得到 2 而不是两个日期之间的持续时间。
  • 在您的示例中,周不在两个不同的周内,2012-02-292012-03-01 属于同一周!你的要求不清楚!
  • >在您列出的场景中,它应该计算两个日期范围之间的周数。那么试试这个,`Weeks weeks = Weeks.weeksBetween(new DateTime().withDate(2012, 02, 29), new DateTime().withDate(2012, 12, 29));
  • 是的,糟糕的是我已经在 OP 中更新了结束时间。

标签: java jodatime


【解决方案1】:

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();

【讨论】:

    【解决方案2】:
        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
    

    它会给你所追求的吗?

    【讨论】:

    • 我认为确实如此,但它与我所做的有什么不同,即:DateTime s = new DateTime(Long.parseLong("1330659427000"));DateTime e = new DateTime(Long.parseLong("1330832227000"));DateTime fs = s.dayOfWeek().withMinimumValue();DateTime fe = e.dayOfWeek().withMaximumValue();Weeks weeks = Weeks.weeksBetween(fs, fe).plus(1);
    • 看起来不错!但这是一个非常奇怪的要求!我只能说!
    猜你喜欢
    • 2011-04-17
    • 1970-01-01
    • 2016-04-18
    • 2014-04-08
    • 2017-04-14
    • 2019-03-21
    • 2014-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多