添加从变量奇数行为获取的PHP日期

问题描述 投票:0回答:3

我有这个问题:我必须添加一些日期来自包含数组中日期值的变量的日期。我已经按照这里找到的许多指南,但它给了我一个奇怪的行为。当我导出由所有代码处理产生的.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 screenshot

非常感谢。

php arrays date variables
3个回答
0
投票

您应该使用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');

0
投票

我认为问题是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");

0
投票

您遇到的问题与strtotime($readyForExport['date_add'])有关,只支持"English date format"并返回false。结果可以是seen in this example

#locale formatted
var_dump(strtotime('30/12/2015')); //bool(false)

#English formatted
var_dump(strtotime('12/30/2015')); //int(1451430000)

要提供更全面的解决方案,请使用图像中显示的日期中的d/m/Yformat (01/01/1979)。正如我注意到图像中的某些日期被格式化为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://3v4l.org/3A8LI

结果:

array(2) {
  ["date_add"]=>
  string(11) "30/11/-0001"
  ["delivery_date"]=>
  NULL
}
© www.soinside.com 2019 - 2024. All rights reserved.