[英]Add days to PHP date taken from a variable - strange behaviour
我遇到了這個問題:我必須為從包含數組日期值的變量獲取的日期添加幾天。 我遵循了此處找到的許多指南,但這給了我一種奇怪的行為。 當我導出所有代碼處理產生的.csv文件時,我們可以意識到日期處理不正確,盡管我使用了正確的PHP命令,但似乎將所需的數字添加到了月份中,而不是添加到導致.csv錯誤的結果。 怎么可能?
我將粘貼以下代碼:
// === data
$newDateAdd = date("d/m/Y", strtotime($readyForExport['date_add']));
$readyForExport['date_add'] = $newDateAdd;
// aggiungo 21 giorni - 3 settimane - alla data di acquisto
$date_mod = date_create($newDateAdd);
date_add($date_mod,date_interval_create_from_date_string("2 days"));
$readyForExport['delivery_date'] = date_format($date_mod,"d/m/Y");
我還上傳了一個屏幕截圖,我們可以看到在.csv中添加的是月份而不是日期...
非常感謝。
我認為問題在於DateTime構造函數期望數據為m / d / Y。
最好直接使用strtotime的結果:
$utime = strtotime($readyForExport['date_add']);
$newDateAdd = date("d/m/Y", $utime);
$readyForExport['date_add'] = $newDateAdd;
// aggiungo 21 giorni - 3 settimane - alla data di acquisto
$date_mod = date_create('now')->setTimestamp($utime);
date_add($date_mod,date_interval_create_from_date_string("2 days"));
$readyForExport['delivery_date'] = date_format($date_mod,"d/m/Y");
您應該為此使用DateTime對象。
首先,最好是面向對象的。
據我所知,它還有更完善的代碼可操作。
$newDateAdd = new DateTime($readyForExport['date_add']);
$readyForExport['date_add'] = $newDateAdd->format('d/m/Y');
// aggiungo 21 giorni - 3 settimane - alla data di acquisto
$date_mod = clone $newDateAdd;
$date_mod->add(new DateInterval('P2D'));
$readyForExport['delivery_date'] = $date_mod->format('d/m/Y');
您遇到的問題與strtotime($readyForExport['date_add'])
僅支持“英語日期格式”並返回false
。 在本示例中可以看到其結果。
#locale formatted
var_dump(strtotime('30/12/2015')); //bool(false)
#English formatted
var_dump(strtotime('12/30/2015')); //int(1451430000)
為了提供更全面的解決方案,請使用圖像中顯示的日期中的d/m/Y
格式(01/01/1979)
。 如我30/11/-0001
,圖像中的某些日期格式為30/11/-0001
,這也會使new \\DateTime
失敗並引發異常,如我的注釋中所述。
此解決方案將驗證提供的date_add
值是否使用所需格式。 然后使用經過驗證的日期添加兩天,並為delivery_date
設置所需的格式。
示例30/12/2015
: https : //3v4l.org/RZ8VZ
$dateFormat = 'd/m/Y';
if (!empty($readyForExport['date_add']) &&
$dateAdd = DateTimeImmutable::createFromFormat($dateFormat, $readyForExport['date_add']))
{
$dateMod = $dateAdd->modify('+2 days');
$readyForExport['delivery_date'] = $dateMod->format($dateFormat);
}
var_dump($readyForExport);
var_dump($dateAdd->format($dateFormat));
var_dump($dateMod->format($dateFormat));
結果:
array(2) {
["date_add"]=>
string(10) "30/12/2015"
["delivery_date"]=>
string(10) "01/01/2016"
}
string(10) "30/12/2015"
string(10) "01/01/2016"
無效的日期示例30/11/-0001
: https : 30/11/-0001
結果:
array(2) {
["date_add"]=>
string(11) "30/11/-0001"
["delivery_date"]=>
NULL
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.