2013-07-04 169 views
0

我有一個要求,以獲得自創建日期以來經過的天數。這個數字需要減去週末。我只有一些功能:JulianDay,JulianWeek,JulianYear獲取Julian日期值,我也有Today返回今天的日期,它返回日期和時間的時間戳。我已經設法通過使用:JulianDay(今天) - JulianDay(創建日期),但我仍然無法用頭圍繞減去週末計算總天數減週末

+1

你正在使用哪種框架/語言?它可能會變得無關緊要,但它可以幫助其他人指出已存在的日期API,並可能在這方面爲您提供幫助。 – Jasarien

+0

我之所以沒有聲明是因爲我正在Siebel上計算的字段上工作,但我也認爲這樣的算法會很有用 – eddy

+0

哦,現在我明白了。 Mi回答是基於你在哪裏使用java的想法。您基本上需要循環查看所有日期,並詢問當前日期是星期日還是星期六,如果是,則增加計數器。 –

回答

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

感謝您的答案,但與此有關的事情,Siebel的是,它是如此有限,我可以做什麼,因爲這個功能是必要的因此,我沒有奢侈的這樣的功能。只有提到的功能是可用的 – eddy

2

不能完全確定你在你的問題中引用的功能做的,但是,你彷彿是舒服 做基本的日期運算以確定兩個給定日期之間的天數。困難的部分似乎 要弄清楚如何可能幾天減去週末。

我想你可以用兩個函數實現這一點:

  1. 給定兩個日期,返回它們之間的天數。致電此DAYS(date-1, date-2)
  2. 給定一個日期,返回星期幾(其中1 =星期一... 7 =星期日)。調用此DAY-OF-WEEK(date)

具備這些功能,那麼你可以做到以下幾點:

  • 計算全周的日期範圍: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。因爲維基百科做了很好的描述,所以我不會在這裏重複這個算法 。

希望這可以讓你對你的方式...

+0

這似乎是一個很好的算法,但我剛發現在我的上下文中,我不能使用%:(這麼多的限制! – eddy

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,然後第一天的JulianDay加1模7,然後第一天的JulianDay加2模7,然後第一天的JulianDay加3模7確定多少他們是週一至週五的工作日數。

所有你需要的是一個JulianDay函數。