使用java排除特定日期之间的某些日期之间的天数计算日历

问题描述:

我试图想出一种方法来计算两个不同日期之间的天数,但是一周中的某些日期仅限于被解释。例如,假设我们要计算8/1和8/31之间的工作天数,但员工只能在星期一,星期二和星期三工作。其结果是,该员工仅在此期间工作15天。使用java排除特定日期之间的某些日期之间的天数计算日历

有没有人放在一起使用Java日历类类似的东西?

+4

只是一个提示:要非常,非常小心这样做,麻痹大意,并找到一个会计师为你测试它,看看它是否有意义。程序员是逻辑生物,会计师+税码不合逻辑。有很多事情可能会出错。 – Oliver

+0

如果当月的星期一,星期二或星期三是银行/公众假期? – jarnbjo

您可以通过将日期递增一天,直到达到结束日期。在每次迭代时,检查一天是星期一,星期二或星期三,并增加计数器。

例如:

final Calendar current = Calendar.getInstance(); 
current.set(2011, 7, 1); 

final Calendar end = Calendar.getInstance(); 
end.set(2011, 7, 31); 

int count = 0; 
while (current.compareTo(end) != 0) { 
    current.add(Calendar.DAY_OF_MONTH, 1); 
    int dayOfWeek = current.get(Calendar.DAY_OF_WEEK); 
    if (dayOfWeek == Calendar.MONDAY || 
     dayOfWeek == Calendar.TUESDAY || 
     dayOfWeek == Calendar.WEDNESDAY) { 
     count++; 
    } 
} 
System.out.println(count); 
+0

您的输出是14,而杰夫预计是15. – jarnbjo

+0

是的,我知道。杰夫应该能够调整它,使其“包容性”的开始日期。 – dogbane

+0

在我们版本的oracle java.version 1.4.2_06 中出现以下错误。 错误(28,20):在类java.util.Calendar中找不到方法compareTo(java.util.Calendar) –

你可以滚动使用java.util.Calendar让自己的解决方案;不过,我建议看看现有的一些库,例如ObjectLab Kit日期实用程序。

尝试Joda Time,是管理日期和时间的最佳解决方案。

罗布麻的代码更正:

final Calendar current = Calendar.getInstance(); 
    current.set(2011, 7, 1); 

    final Calendar end = Calendar.getInstance(); 
    end.set(2011, 7, 31); 
    int count = 0; 
    while (!current.after(end)) { 
     int dayOfWeek = current.get(Calendar.DAY_OF_WEEK); 
     if (dayOfWeek == Calendar.MONDAY || 
      dayOfWeek == Calendar.TUESDAY || 
      dayOfWeek == Calendar.WEDNESDAY) { 
      count++; 
     } 
     current.add(Calendar.DAY_OF_MONTH, 1); 
    } 
    System.out.println(count); 

如果使用乔达时间

DateTime current = new DateTime(2011, 8, 1, 0, 0, 0, 0); 
    DateTime end = new DateTime(2011, 8, 31, 0, 0, 0, 0); 
    int count = 0; 
    while (!current.isAfter(end)) { 

     int dayOfWeek = current.getDayOfWeek(); 
     if (dayOfWeek == DateTimeConstants.MONDAY || dayOfWeek == DateTimeConstants.TUESDAY 
       || dayOfWeek == DateTimeConstants.WEDNESDAY) { 
      count++; 
     } 
     current = current.plusDays(1); 
    } 
    System.out.println(count); 
+0

谢谢大家,jonagr,修改后的代码现在编译。 –

+0

然而,在8/1到8/31,应该返回15,但由于某种原因返回12.任何想法? –

+0

它没有出现2011年7月1日正确设置。 7月1日应该是星期五(6),但java日历认为它是星期一(2)。我对乔达时代并不熟悉,我该如何使用它来完成这项工作? –