gpt4 book ai didi

php - 从给定日期查找前三个工作日

转载 作者:可可西里 更新时间:2023-11-01 13:03:53 24 4
gpt4 key购买 nike

我需要找到从给定日期开始的前三个工作日,省略周末和节假日。这本身并不是一项艰巨的任务,但我打算这样做的方式似乎过于复杂,所以我想我应该先征求您的意见。

为了让事情变得更有趣,让我们把它变成一场比赛。我将悬赏 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'
);

请注意,在实际情况下,假期不是硬编码的,而是来自 get_holidays($year) 函数。如果您愿意,您可以在答案中包含/使用它。

因为我提供赏金,这意味着至少需要三天才能将答案标记为已接受(2 天添加赏金,1 天直到我可以接受)。


注意

如果您使用固定的一天长度(例如 86400 秒)从一天跳到另一天,您将遇到夏令时问题。请改用 strtotime('-1 day', $timestamp)

这个问题的一个例子:

http://codepad.org/uSYiIu5w


最终解决方案

这是我最终使用的最终解决方案,改编自 Keith Minkler 关于使用 strtotimelast 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;
}

最佳答案

这应该可以解决问题:

    // Start Date must be in "Y-m-d" Format
function LastThreeWorkdays($start_date) {
$current_date = strtotime($start_date);
$workdays = array();
$holidays = get_holidays('2010');

while (count($workdays) < 3) {
$current_date = strtotime('-1 day', $current_date);

if (in_array(date('Y-m-d', $current_date), $holidays)) {
// Public Holiday, Ignore.
continue;
}

if (date('N', $current_date) < 6) {
// Weekday. Add to Array.
$workdays[] = date('Y-m-d', $current_date);
}
}

return array_reverse($workdays);
}

我已经在 get_holidays() 函数中进行了硬编码,但我相信您会理解并调整它以适应它。其余的都是工作代码。

关于php - 从给定日期查找前三个工作日,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3093266/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com