我有一个循环计算周末,它的工作原理如下:
$weekends = 0;
while ($begin <= $today) {
$no_days++;
$what_day = date("N", $begin);
if ($what_day > 5) {
$weekends++;
};
$begin += 86400;
};
$ begin是这个月的第一天,今天是$今天,我得到的是这样的:
$begin = date("Y-m-01");
$today = date("Y-m-d");
$ begin和$ today是正确的,但由于某种原因,我的循环说连续3天是周末。为了调试原因,我在if里面打印了$ begin的值,得到了以下输出:
2016-11-05 12:11:00(1478329200)
2016-11-06 12:11:00(1478415600)
2016-11-06 11:11:00(1478502000)
相反,我期望获得的是:
2016-11-05 12:11:00(1478329200)
2016-11-06 12:11:00(1478415600)
2016-11-07 12:11:00(1478502000)
这个脚本已经好几个月了,但是今天就停止工作了。我在开始时有一个date_default_timezone_set('America/Los_Angeles');
。
我不完全理解日期是如何工作的,因此,我不确定如何开始寻找问题,所以,如果这是一个与时区相关的问题,有人想指出我要了解这个主题的信息来源,我将非常高兴:)
编辑:正如@Devon指出的那样。我为$end
更改了$today
以避免误解。
答案 0 :(得分:1)
您应该考虑使用PHP的DateTime
,DateInterval
和DatePeriod
类。
function countWeekendDaysBetweenDateTimes(DateTime $start, DateTime $end) {
$weekend_count = 0;
// one day interval
$interval = new DateInterval('P1D');
// get date period object based on start, end, interval
$date_period = new DatePeriod($start, $interval, $end);
foreach($date_period as $dt) {
if ((int)$dt->format('N') > 5) {
$weekend_count++;
}
}
return $weekend_count;
}
这些类在处理范围和日期重现时更加可靠,通常还可以简化处理时区(DateTimeZone
),夏令时,闰年以及日历的其他异常和时间系统。