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

时间:2016-11-07 15:23:30

标签: php date datetime

我有一个循环计算周末,它的工作原理如下:

$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以避免误解。

1 个答案:

答案 0 :(得分:1)

您应该考虑使用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),夏令时,闰年以及日历的其他异常和时间系统。