我有一个计算周末天数的循环,它是这样工作的:
$weekends = 0;
while ($begin <= $today) {
$no_days++;
$what_day = date("N", $begin);
if ($what_day > 5) {
$weekends++;
};
$begin += 86400;
};
$begin是这个月的第一天,$today是今天,我把它们写成这样:
$begin = date("Y-m-01");
$today = date("Y-m-d");
$begin和$today是正确的,但由于某种原因,我的循环显示连续3天是周末。出于调试的原因,我在if中打印了$begin on的值,得到了以下输出:
相反,我期望得到的是: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
。
您应该考虑使用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
)、夏令时、闰年以及我们的日历和时间系统的其他异常。