首页 > 解决方案 > PHP Mktime 显示 3 月 2 日当我每个月转储时

问题描述

我一直在使用以下功能,直到前几天时钟前进:

function months($month_format="F") {
$array = array();
for ($i = 1; $i <=12; $i++) {
    $array[$i]['string'] = date($month_format, mktime(0,0,0,$i));
    $array[$i]['int'] = date('m', mktime(0,0,0,$i));
}
return $array;
}

它输出一个数组:

从前几天开始(就像 2 天前,当英国的时钟向前走时),该功能似乎向我显示 2 月 2 月和 0 月 2 月....

非常非常奇怪......我正在使用 rethinkdb 和他们的 eachPosTime 函数......不确定这是否是导致它的原因。

我尝试使用不同的功能,但仍在使用 mktime:

function months(){
 $start_month = 1;
 $end_month = 12;
 $start_year = date("Y");
 $array = array();
 for($m=$start_month; $m<=12; ++$m){

    echo $m.'<br>';

    $array[$m]['string'] = date('F', mktime(0,0,0,$m));
    $array[$m]['int'] = date('m', mktime(0,0,0,$m));

       if($start_month == 12 && $m==12 && $end_month < 12) 
       {
           $m = 0;
           $start_year = $start_year+1;
       }
 //echo date('F Y', mktime(0, 0, 0, $m, 1, $start_year)).'<br>';
 if($m == $end_month) break;
}
return $array;
}

尽管如此,我还是没有运气。检查这里的图像,它显示了months() 函数的输出:

月()函数的输出

标签: phpmktime

解决方案


这与时钟变化无关,而是与月份的时间有关,以及mktime 函数的完全无用的签名。

当您从“mktime”调用中遗漏参数时,它们将被填充为今天的日期。在您的情况下,您指定了没有日期或年份的月份,因此当您要求mktime(0, 0, 0, 2);时将填写今天的日期和年份,并查找 2021 年 2 月 29 日 - 一个不存在的日子。由于时间库“溢出”日期,这变成了 3 月 1 日。

解决方案是将明确的一天传递给“mktime”,如mktime(0,0,0,$m,1)使用或使用较少混淆的函数。


推荐阅读