【问题标题】:How do I calculate the days per month given a start date and a duration?给定开始日期和持续时间,我如何计算每月的天数?
【发布时间】:2011-01-12 15:25:02
【问题描述】:

试图找出一个小问题。我有一个开始日期和一个持续时间(以周为单位),并且需要计算在此期间每月的工作日数。

例如: 开始日期:2011-02-07 持续时间:10 周

我想取回以下内容:

2 月:16 天 三月:23天 四月:11天

任何帮助都会很棒。谢谢。

【问题讨论】:

标签: php datetime codeigniter


【解决方案1】:

5.3 之前的解决方案:

$start = $current = strtotime('2011-02-07');
$end = strtotime('+10 weeks', $start);
$months = array();
while($current < $end) {
    $month = date('M', $current);
    if (!isset($months[$month])) {
        $months[$month] = 0;
    }
    $months[$month]++;
    $current = strtotime('+1 weekday', $current);
}
print_r($months);

输出(codepad):

Array
(
    [Feb] => 16
    [Mar] => 23
    [Apr] => 11
)

【讨论】:

  • @gordon 如果日期和持续时间是变量怎么办? Duration 是一个类似 10 的 int,并且 date 是相同的。抱歉应该更清楚。
  • @Brian 不是问题:strtotime($date); strtotime("+$w weeks")
  • @gordon 我想为每月的最后天数添加什么值?我不确定在哪里添加它,因为它正在计数。
  • @Brian 上面的方法不知道它何时从一个月转移到另一个月,因此您必须添加一个 $previousMonth 变量并将其与 $month 变量进行比较,当它们不是同样,您知道新的一个月开始了。作为替代方案,只需在结果数组上使用array_walkarray_map
【解决方案2】:
$start=date_create('2011-02-07');
$interval=new DateInterval('P10W');
$end=date_add(clone $start,$interval);//use clone otherwise $start gets changed

$period=new DatePeriod($start, new DateInterval('P1D'), $end);

foreach($period as $day){
  if($day->format('N')<6) $workdays[$day->format('F')]++; //N is 1-7 where Monday=1
}

var_dump($workdays);

【讨论】:

  • 这也是我得到的。另外我将如何为 DateInterval 设置一个变量?
  • 另外我不认为我有 DateInterval 可用,因为它只有在 5.3 中才能实现这一点?
  • 您需要 PHP 大于或等于 5.3.0 版本
  • @Gordon:修复了语法错误-忘记关闭括号。此外,由于该函数的工作方式很奇怪,因此将 clone 添加到 date_add 行。但是,对于这种方法,您必须使用 PHP5.3 或更高版本。对于以前的版本,您可以使用 date() 进行数学运算,但您可能会遇到闰年问题和新的 DateTime/DateInterval/DatePeriod 对象为您处理的其他边缘情况。
  • @Gordon:通知是关于未定义的索引和变量的。如果你想避免它们,你可以在循环之前初始化$workdays=array('January'=&gt;0,...)
猜你喜欢
  • 2022-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多