1.最近做數(shù)據(jù)可視化 用的圖表 echarts.js
然后傳參橫坐標(biāo)日期時(shí)用到了strtotime這個(gè)函數(shù),結(jié)果發(fā)現(xiàn)有坑,昨天是2019-05-30都是正常的,發(fā)版后今天31號(hào)就全錯(cuò)了
原代碼
function createMonthLine($monthLong, $format= "ym"){
$monthLine = [];
for ($i=1; $i<= $monthLong; $i++){
$monthLine[] = date($format, strtotime("-".($monthLong-$i)." month"));
}
return $monthLine;
}
新代碼
function createMonthLine($monthLong, $format= "ym"){
$monthLine = [];
for ($i=1; $i<= $monthLong; $i++){
$monthLine[] = date($format, strtotime("first day of -".($monthLong-$i)." month"));
}
return $monthLine;
}
其中的原理,見(jiàn)鳥(niǎo)哥博客分析: http://www.laruence.com/2018/07/31/3207.html
大概原因是 如下規(guī)則
以當(dāng)前傳值日期 按照要求處理年月日 如果年月日被處理后超過(guò)了合理值,會(huì)自動(dòng)進(jìn)一位;當(dāng)月日滿(mǎn)進(jìn)月位, 當(dāng)年月滿(mǎn)進(jìn)年位
試下幾個(gè)代碼就知道問(wèn)題了
var_dump(date("Y-m-d", strtotime("2019-02-31")));
# 2019-03-03
# 2019年的2月只有28天 日滿(mǎn)進(jìn)月 日取余; 變?yōu)?019-03-03 符合
var_dump(date("Y-m-d", strtotime("2019-12-32")));
# 1970-01-01
# 不符合期望 以為會(huì)是 12月沒(méi)有32 進(jìn)1月 然后月滿(mǎn)進(jìn)年 最后為 2020-01-01
var_dump(date("Y-m-d", strtotime("2019-13-01")));
# 1970-01-01
# 不符合期望 以為會(huì)是 1年沒(méi)有12個(gè)月 進(jìn)1年 最后為 2020-01-01
var_dump(date("Y-m-d", strtotime("-1 month", strtotime("2019-08-31"))));
# 2019-07-31 正常日期
var_dump(date("Y-m-d", strtotime("+1 month", strtotime("2019-08-31"))));
# 2019-10-01 9月沒(méi)有31號(hào),日滿(mǎn)進(jìn)月
var_dump(date("Y-m-d", strtotime("-1 month", strtotime("2019-03-27"))));
# 2019-02-27 也并不是評(píng)論里所說(shuō)減去上個(gè)月的天數(shù)
var_dump(date("Y-m-d", strtotime("+1 month", strtotime("2019-12-31"))));
# 2020-01-31 月滿(mǎn)進(jìn)年
var_dump(date("Y-m-d", strtotime("-1 month", strtotime("2020-01-31"))));
# 2019-12-31 月減退年
var_dump(date("Y-m-d", strtotime("2020-01-31 -1 month")));
# 2019-12-31 月減退年
結(jié)論如下:
1.進(jìn)位規(guī)則在顯示指定被處理的日期時(shí), 日進(jìn)位退位正常,月退位正常,進(jìn)位異常,會(huì)導(dǎo)致年變成1970
2.進(jìn)位規(guī)則在默認(rèn)指定被處理日期為當(dāng)前時(shí), 日月年進(jìn)位退位均正常