Tôi cần tìm ba ngày làm việc trước đó từ một ngày nhất định, bỏ qua các ngày cuối tuần và ngày lễ. Đây không phải là một nhiệm vụ khó khăn trong chính nó, nhưng có vẻ như cách tôi sẽ làm nó sẽ quá phức tạp, vì vậy tôi nghĩ tôi sẽ hỏi ý kiến của bạn trước.Tìm ba ngày làm việc trước đó từ một ngày cụ thể
Để làm cho mọi thứ thú vị hơn, hãy thực hiện cuộc thi này. Tôi đang cung cấp 300 như một tiền thưởng để bất cứ ai đi lên với các giải pháp ngắn nhất, sạch nhất mà tuân thủ các đặc điểm kỹ thuật này:
- Viết một hàm trả về ba ngày làm việc trước đó từ một ngày nhất định
- ngày làm việc được xác định như bất kỳ ngày nào không phải là thứ bảy hay chủ nhật và không phải là ngày lễ
- Chức năng biết ngày lễ cho năm của ngày cụ thể và có thể đưa các tài khoản này vào tài khoản
- Hàm này chấp nhận một tham số, ngày, trong
Y-m-d
định dạng - Hàm trả về một mảng có ba ngày ở định dạng
Y-m-d
, được sắp xếp từ cũ nhất đến mới nhất.
Extra:
- Chức năng có thể tìm thấy cũng là tiếp theo ba ngày làm việc, thêm vào trước ba
Một ví dụ về mảng lễ:
$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'
);
Lưu ý rằng trong kịch bản thực tế, ngày lễ không phải là mã cứng d nhưng đến từ hàm get_holidays($year)
. Bạn có thể bao gồm/sử dụng nó trong câu trả lời của bạn nếu bạn muốn.
Khi tôi đang cung cấp tiền thưởng, điều đó có nghĩa là sẽ có ít nhất ba ngày trước khi tôi có thể đánh dấu câu trả lời được chấp nhận (2 ngày để thêm tiền thưởng, 1 ngày cho đến khi tôi có thể chấp nhận).
Note
Nếu bạn sử dụng một ngày dài cố định như 86400 giây để nhảy từ ngày này sang khác, bạn sẽ gặp vấn đề với thời gian tiết kiệm ánh sáng ban ngày. Sử dụng strtotime('-1 day', $timestamp)
để thay thế.
Một ví dụ về vấn đề này:
giải pháp cuối cùng
Dưới đây là giải pháp cuối cùng tôi đã kết thúc sử dụng, chuyển thể từ ý tưởng của việc sử dụng Keith Minkler của 's last weekday
.Phát hiện sự chỉ đạo từ đếm trôi qua, nếu tiêu cực, tìm kiếm ngược, và chuyển tiếp vào dương:
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;
}
Một vài câu trả lời có chức năng nhận ngày lễ theo năm - nhưng họ nhận được năm từ đầu vào - trong những năm đó vào ngày 1 tháng 1, thứ 6 trước đó là ngày lễ Mỹ Nhưng bảng cho ăn của năm 2011 tính ngày 31 tháng 12 năm 2010 là ngày lễ '2011', do đó, nó là một phần về việc tạo ra các bảng đúng trước thời hạn: http://www.opm.gov/operating_status_schedules/fedhol/2011.asp – Joe
Điểm hợp lệ Joe. Lý tưởng nhất là "get_holidays" nên chấp nhận một ngày làm đối số của nó. Bằng cách đó, nó có thể trả lại tất cả các ngày lễ 1 tuần một trong hai bên của ngày đó (ngay cả khi tuần đó xảy ra kéo dài hơn một năm cuối cùng). – Wireblue