Php 在给定开始日期和持续时间的情况下,如何计算每月的天数?

Php 在给定开始日期和持续时间的情况下,如何计算每月的天数?,php,datetime,codeigniter,Php,Datetime,Codeigniter,试图找出一个小问题。我有一个开始日期和持续时间(以周为单位),需要计算持续时间内每月的工作天数 例如: 开始日期:2011-02-07 持续时间:10周 我想得到以下信息: 2月:16天 3月:23天 四月:十一天 任何帮助都会很好。谢谢 $start=创建日期('2011-02-07'); $start=date_create('2011-02-07'); $interval=new DateInterval('P10W'); $end=date_add(clone $start,$inter

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

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

我想得到以下信息:

2月:16天 3月:23天 四月:十一天

任何帮助都会很好。谢谢

$start=创建日期('2011-02-07');
$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);
$interval=新的日期间隔('P10W'); $end=date\u add(克隆$start,$interval)//使用clone,否则$start将被更改 $period=new DatePeriod($start,new DateInterval('P1D'),$end); foreach($期间为$天){ 如果($day->format('N')format('F')]++;//N是1-7,其中周一=1 } var_转储(工作日);
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);

从周一到周五的工作日?也许这可以帮你弄清楚:这也是我得到的。我如何为DateInterval设置一个变量?我也不认为我有DateInterval可用,因为它只有5.3版本,没有任何方法可以做到这一点?你需要PHP大于或等于5.3版本。0@Gordon:修复了语法错误-forgot关闭括号。此外,由于函数的工作方式很奇怪,因此在
date\u add
行中添加了
clone
。但是,此方法必须使用PHP5.3或更高版本。对于以前的版本,可以使用
date()进行计算
但是新的DateTime/DateInterval/DatePeriod对象为您处理闰年和其他边缘情况时,您可能会遇到问题。@Gordon:这些通知是关于未定义的索引和变量的。如果您想避免它们,您可以初始化
$workdays=array('一月'=>0,…)
在循环之前。@gordon如果日期和持续时间是变量怎么办?持续时间是一个类似于10的整数,并且日期是相同的。抱歉应该更清楚。@Brian没有问题:
strotime($date);strotime(“+$w weeks”)
@gordon我想在每月的最终天数中添加一个值是什么?我不确定在计数时在哪里添加该值。@Brian上述方法不知道从一个月到另一个月的转换时间,因此您必须添加一个$previousMonth变量,并将其与$month变量进行比较,以及它们何时不同你知道新的一个月开始了。作为替代方法,只需在结果数组上使用
array\u walk
array\u map
Array
(
    [Feb] => 16
    [Mar] => 23
    [Apr] => 11
)