我需要查找給定日期之前的三個工作日,而不是週末和假日。這本身並不是一項艱鉅的任務,但似乎我打算這麼做的方式過於複雜,所以我想我會首先徵求您的意見。查找給定日期之前的三個工作日
爲了讓事情更有趣,讓我們來舉辦一場比賽。我出價300作爲賞金誰與遵守此規範最短的,乾淨的解決方案出現:
- 編寫返回從工作日是指某一特定日期
- 前三個工作日功能因爲任何一天,是不是星期六或星期日,而不是一個節日
- 功能知道給定日期的一年假期,可以考慮這些
- 該函數接受一個參數,日期,
Y-m-d
格式 - 函數返回格式爲
Y-m-d
的三個日期的數組,從最舊到最新排序。
附加:
- 該功能可以發現也下一個三個工作日內,除了前三個
假期陣列的一個例子:
$holidays = array(
'2010-01-01',
'2010-01-06',
'2010-04-02',
'2010-04-04',
'2010-04-05',
'2010-05-01',
'2010-05-13',
'2010-05-23',
'2010-06-26',
'2010-11-06',
'2010-12-06',
'2010-12-25',
'2010-12-26'
);
請注意,在真實場景中,節假日不是硬編碼d但來自get_holidays($year)
的功能。如果你願意,你可以在你的答案中包含/使用它。
由於我提供的是賞金,這意味着至少有三天才能將答案標記爲已接受(2天添加賞金,1天直到我可以接受)。
注意
如果你使用一個固定的日長如86400秒從白天跳到另一個,你會碰到日光節約時間的問題。改爲使用strtotime('-1 day', $timestamp)
。
這個問題的一個例子:
最終解決
下面是最終解決方案,我結束了使用,改編自使用的基思·明克勒的想法strtotime
的last weekday
。檢測從通過計數的方向,如果爲負,搜索向後和向前正面:
function working_days($date, $count) {
$working_days = array();
$direction = $count < 0 ? 'last' : 'next';
$holidays = get_holidays(date("Y", strtotime($date)));
while(count($working_days) < abs($count)) {
$date = date("Y-m-d", strtotime("$direction weekday", strtotime($date)));
if(!in_array($date, $holidays)) {
$working_days[] = $date;
}
}
sort($working_days);
return $working_days;
}
一些答案有一個功能,可以按年份獲得假期 - 但是他們從輸入中獲得年份 - 對於那些在1月1日是星期六,星期五是假期的年份美國但美聯儲2011年的數據顯示2010年12月31日爲'2011'假期,所以部分原因是需要提前正確生成表格:http://www.opm.gov/operating_status_schedules/fedhol/2011.asp – Joe 2010-06-25 01:08:30
有效點喬。理想情況下,「get_holidays」應該接受日期,因爲它是參數。這樣,它可以在該日期的任何一側返回所有節假日(即使該周恰好跨越一年)。 – Wireblue 2010-06-25 03:48:29