Date将来自未来的时间戳视为来自过去的日期


Date considers a Timestamp from the future as a date from the past

我有一个计算周末天数的循环,它是这样工作的:

$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的DateTimeDateIntervalDatePeriod类。

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)、夏令时、闰年以及我们的日历和时间系统的其他异常。