簡體   English   中英

從變量中提取日期到PHP日期-奇怪的行為

[英]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中添加的是月份而不是日期...

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/2015https : //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/-0001https : 30/11/-0001

結果:

array(2) {
  ["date_add"]=>
  string(11) "30/11/-0001"
  ["delivery_date"]=>
  NULL
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM