计算总天数减去周末

时间:2013-07-04 15:48:34

标签: algorithm date

我要求获得自创建日期以来经过的天数。这个数字需要减去周末。我只有一些功能:JulianDay,JulianWeek,JulianYear获得Julian日期值,我也有今天返回今天的日期,时间戳返回日期和时间。我已经设法通过使用:JulianDay(今天)-JulianDay(创建日期)来获得今天创建日期的差异但我仍然无法绕过减去周末

3 个答案:

答案 0 :(得分:2)

不完全确定您在问题中引用的功能是什么,但是,您似乎对此感到满意 执行基本日期算术以确定两个给定日期之间的天数。困难的部分似乎 要弄明白周末可以减去几天。

我认为你可以用两个功能完成这个任务:

  1. 给定两个日期,返回它们之间的天数。请拨打此DAYS(date-1, date-2)
  2. 给定日期,返回星期几(其中1 =星期一... 7 =星期日)。请拨打此DAY-OF-WEEK(date)
  3. 拥有这些功能后,您可以执行以下操作:

    • 计算日期范围内的整周:WEEKS = DAYS(date-1, date2) mod 7
    • 计算天数不是整周的部分:DAYS-LEFT = DAYS(date-1, date-2) - (WEEKS * 7)
    • 确定最后一天的哪一天:LAST-DAY = DAY-OF-WEEK(date-2)

    从部分周调整DAYS-LEFT的数量,如下所示:

    if DAYS-LEFT > 0 then
      case LAST-DAY
        when 6 then /* Saturday */
          DAYS-LEFT = DAYS-LEFT - 1
        when 7 then /* Sunday */
          if DAYS-LEFT = 1 then
             DAYS-LEFT = 0
          else
             DAYS-LEFT = DAYS-LEFT - 2
          end-if
        when other /* Monday through Friday */
          case DAYS-LEFT - LAST-DAY
            when > 1 then
              DAYS-LEFT = DAYS-LEFT - 2
            when = 1 then
              DAYS-LEFT = DAYS-LEFT - 1
            when other
              DAYS-LEFT = DAYS-LEFT /* no adjustment */
           end-case
      end-case
    end-if
    
    DAYS-EXCLUDING-WEEKENDS = DAYS(date-1, date-2) - (WEEKS * 2) + DAYS-LEFT
    

    我假设您拥有或可以构建DAYS(date-1, date-2)函数。接下来的一点是确定一周中的哪一天 给定的日期依然存在。执行此操作的算法称为Zeller's congruence。我不会 这里重复算法,因为维基百科在描述它时做得很好。

    希望这能让你顺利上路......

答案 1 :(得分:1)

您的JulianDay(y,m,d)函数会返回每个日期的序列号;让我们说为了讨论,JulianDay(2013,7,4)返回2456478.第二天将是2456479,然后是2456480,依此类推。让我们说两天的差异是 diff

diff 中的整周数,每个包含5个工作日,为diff // 7(这是整数除法,因此向下舍入)。因此,如果 diff 为25,则会有25 // 7 = 3整周以及额外diff % 7 = 4天。整整3个星期有15个工作日;你从一周的哪一天开始并不重要。所以你只需要考虑额外的4天,看看工作日怎么样。

JulianDay函数返回的数字可以采用模7来计算星期几;在我的JulianDay函数上,模5代表星期六,模6代表星期日。您可以将额外的4天视为期初的4天或结束时的4天;这并不重要,因为所有其他日子都是连续整周的一部分,每个星期都有5个工作日。假设您选择前4天。然后取第7天的JulianDay模7,然后是第一天的JulianDay加上1模7,然后是第一天的JulianDay再加上2模7,那么{ {1}}第一天加3模7,确定其中有多少是工作日,并将其添加到整周的工作日数。

您只需要一个JulianDay功能。

答案 2 :(得分:0)

此代码应该按您的要求执行:

Date fromDate = new Date(System.currentTimeMillis()-(30L*24*60*60*1000)); // 30 days ago
Date toDate = new Date(System.currentTimeMillis()); // now
Calendar cal = Calendar.getInstance();
cal.setTime(fromDate);
int countDays = 0;
while (toDate.compareTo(cal.getTime()) > 0) { 
    if (cal.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY && cal.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY)
        countDays++;
    cal.add(Calendar.DATE, 1);      
}
System.out.println(countDays);