Ben hafta sonları ve tatil atlayarak, belirli bir tarihten itibaren üç önceki işgünü bulmalıyız. Bu başlı başına zor bir iş değil, ama bunu yapmak için gidiyordu yolu aşırı karmaşık olacak gibi görünüyor, bu yüzden ben ilk görüş sormak düşündüm.
Işler daha ilginç hale getirmek için, bunu bir yarışma yapalım. Ben bir lütuf olarak 300 teklif ediyorum kim bu özelliğine uygun kısa, temiz çözüm ile geliyor:
- Belirli bir tarihten itibaren üç önceki işgünü döndüren bir fonksiyon yazın
- Çalışma günü Cumartesi ya da Pazar değil ve bir tatil değil herhangi bir gün olarak tanımlanır
- Işlevi belirli bir tarihin yıl tatillerini bilir ve dikkate bu alabilir
- Fonksiyonu
Y-m-dbiçiminde, bir parametre, tarih kabul - Işlevi, eski gelen yeni sıralanır
Y-m-dbiçiminde, üç tarihleri ile bir dizi döndürür.
Ekstra:
- Işlevi önceki üç ek olarak next üç işgünü da bulabilirsiniz
Tatil dizinin bir örnek:
$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'
);
Gerçek senaryoda, tatil kodlanmış olmadığını unutmayın ama get_holidays($year) fonksiyonu geliyor. İsterseniz size cevap kullanan / içerebilir.
Ben bir lütuf sunan kulüpler gibi, kabul gibi (ben kabul kadar bir lütuf eklemek için 2 gün, 1 gün) bir cevap işaretlemek önce en az üç gün orada olacak demektir.
Note
Başka bir güne atlamak için böyle 86400 saniye gibi sabit bir gün uzunluğunu kullanırsanız, yaz saati ile sorunlar koşacağız. strtotime('-1 day', $timestamp) yerine kullanın.
Bu sorunun bir örneği:
Final solution
İşte strtotime 's last weekday kullanarak Keith Minkler fikri uyarlanan ben kullanarak sona erdi nihai çözüm, bulunuyor. Negatif ise, geriye arar ve ileriye olumlu üzerine, geçti sayımı yönünü algılar:
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;
}