【问题标题】:PHP strtotime +1 week errorPHP strtotime +1 周错误
【发布时间】:2014-09-30 13:56:25
【问题描述】:

我对 strtotime 和以下代码有疑问(我想要给定时间范围内的所有日历弱点)

$all_dates = array();
$tempdate = '2014-01-01';
$enddate = '2015-03-01';

while (strtotime($tempdate) <= strtotime($enddate)) {
    $all_dates[] = date('Y-W', strtotime($tempdate));
    $tempdate = date('Y-m-d', strtotime($tempdate . '+1 week'));
}

var_dump($all_dates);

var_dump 产生以下输出

array (
    0 => '2014-01',
    1 => '2014-02',
    2 => '2014-03',
    3 => '2014-04',
    4 => '2014-05',
    5 => '2014-06',
    6 => '2014-07',
    7 => '2014-08',
    8 => '2014-09',
    9 => '2014-10',
    10 => '2014-11',
    11 => '2014-12',
    12 => '2014-13',
    13 => '2014-14',
    14 => '2014-15',
    15 => '2014-16',
    16 => '2014-17',
    17 => '2014-18',
    18 => '2014-19',
    19 => '2014-20',
    20 => '2014-21',
    21 => '2014-22',
    22 => '2014-23',
    23 => '2014-24',
    24 => '2014-25',
    25 => '2014-26',
    26 => '2014-27',
    27 => '2014-28',
    28 => '2014-29',
    29 => '2014-30',
    30 => '2014-31',
    31 => '2014-32',
    32 => '2014-33',
    33 => '2014-34',
    34 => '2014-35',
    35 => '2014-36',
    36 => '2014-37',
    37 => '2014-38',
    38 => '2014-39',
    39 => '2014-40',
    40 => '2014-41',
    41 => '2014-42',
    42 => '2014-43',
    43 => '2014-44',
    44 => '2014-45',
    45 => '2014-46',
    46 => '2014-47',
    47 => '2014-48',
    48 => '2014-49',
    49 => '2014-50',
    50 => '2014-51',
    51 => '2014-52',
    52 => '2014-01',
    53 => '2015-02',
    54 => '2015-03',
    55 => '2015-04',
    56 => '2015-05',
    57 => '2015-06',
    58 => '2015-07',
    59 => '2015-08',
    60 => '2015-09',
)

问题是条目号 52 带有“2014-01”,它应该是“2015-01”。在 2015-01-01 到 2016-03-01 的时间范围内,结果还可以。这是 strtotime 函数中的错误吗? 我正在使用 PHP 版本 5.5.10

感谢您的帮助。

【问题讨论】:

    标签: php date strtotime week-number


    【解决方案1】:

    更改此行并使用o iso 年份:

    $all_dates[] = date('o-W', strtotime($tempdate));
                     //  ^
    

    【讨论】:

    • 我也是。我猜我第一次尝试时打错字了。
    • 由于前一个已被删除,所有 cmets 都出现故障。但是,是的,它在我第二次尝试时奏效了。
    • 我是如何唯一赞成这个的?虽然我的回答是更好的做法,但这是对这个问题的更好回答。
    • @JohnConde 没问题,实际上如果我是 OP,我更希望得到你的回答,DateTimeclass Rocks
    【解决方案2】:

    这与 ISO 周数有关。此外,strtotime() 是一种不好的日期数学方法,PHP 建议不要这样做(感谢闰年和夏令时)。使用 DateTime() 类准确地执行此操作:

    $startdate = new DateTime('2014-01-01');
    $enddate   = new DateTime('2015-03-01');
    $interval  = new DateInterval('P7D');
    $period    = new DatePeriod($startdate , $interval, $enddate);
    
    foreach($period as $date) {
        $all_dates[] = $date->format('o-W'); // o modifier for ISO year
    }
    
    var_dump($all_dates);
    

    Demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-29
      • 1970-01-01
      • 2015-03-28
      相关资源
      最近更新 更多