将不同的日期格式与美国比较到另一个日期

问题描述 投票:1回答:2

我们基本上有一个日期格式:'d / m / y'。示例 - > '20 / 02/2019',作为字符串。

我们需要能够获得今天的日期和今天的日期+ 15天。然后检查开始时给出的日期是否在这些天之间。

给出日期X.检查日期X是否大于今天的日期A和+15天日期B.

我们希望获得DateTime类型的所有值,并且能够比较给定的日期是否在它们之间。

我已经检查了几个不同的问题,但我无法完成它,在我看来,因为据我所见,我没有正确使用php函数strtotime。

我们检查了所有这些问题:

Adding days to $Date in PHP

PHP date time greater than today

Subtract 1 day with PHP

A non well formed numeric value encountered

PHP date compare older than 15 days

和其他页面一样,非常有用:

https://benholland.me/tutorials/2012/03/11/adding-and-subtracting-dates-and-times-in-php.html

但是,价值仍然是错误的。

$date = $item->getData('attribute_name'); //Value as String
$data = date_create(date('d/m/Y',strtotime($date))); //Creating the DateTime object.

但这会自动给我们:

object(DateTime)#5793 (3) { ["date"]=> string(26) "1970-01-01 00:00:00.000000" ["timezone_type"]=> int(3) ["timezone"]=> string(13) "Europe/Madrid" }

在我看来,它必定是某种格式错误,它会自动给我这个日期。

我还试过最后一个问题:

$date = $item->getData('attribute_name'); //Value as String
$userDate = DateTime::createFromFormat('d/m/Y', $date);
    if ($userDate === false) {
        throw new InvalidArgumentException('Invalid date string');
    }
    $cmp = new DateTime('+15 days'); //today's date +15
    if ($userDate <= $cmp) {
        $userDate = new DateTime();
    }

echo date_format($userDate, 'd/m/Y');

我错过了什么?有没有改进的方法呢?

谢谢

php date date-formatting
2个回答
1
投票

劳尔。

如果要将日期添加到日期,则应对字符串执行此操作,然后将其转换为DateTime:

如果我做对了,你有3个约会:

  • 来自$item->getData('attribute_name');的字符串
  • 用户从$userDate = DateTime::createFromFormat('d/m/Y', $date);作为DateTime日期
  • “+ 15天”日期,您必须计算。

在将字符串转换为DateTime对象(在$data = date_create(date('d/m/Y',strtotime($date)));中)之前,您应该计算“+ 15天”日期。

我是这样做的:

    $datestring = '05/02/2019';

    $date = date_create(date('d/m/Y',strtotime($datestring))); //first date

    $userDate = DateTime::createFromFormat('d/m/Y', '22/02/2019'); //user date

    if ($userDate === false) {
        throw new InvalidArgumentException('Invalid date string');
    }


    $cmp = DateTime::createFromFormat('d/m/Y',date('d/m/Y', strtotime($date->format('Y/m/d').' + 15 days'))); //first date +15 days


    if ($userDate <= $cmp && $userDate >= $date) {
       $result = "The user date is in range";
    }
    else {
        $result = "The user date is out of range";
    }

    echo('<b>First date: </b>'.$date->format('d/m/Y'));
    echo('<br> <b>User date : </b>'.$userDate->format('d/m/Y'));
    echo('<br> <b>Date + 15 : </b>'.$cmp->format('d/m/Y'));


    echo('<br><br>'.$result);

此外,'+ 15天'连接仅适用于Y / m / d格式。这就是我将其格式化为计算的原因。

在我的例子中,我比较$ userDate来检查它是否落在其他两个之间,但你可以根据需要比较它们。

希望能帮助到你


1
投票

根据PHP的魔力,与date_create一样可能表现出与预期不同的行为。 https://secure.php.net/manual/en/function.date-create.php - 阅读第二条评论。由于您使用的是dd / mm / YYYY格式,因此可能无法正常工作。

在您正在使用的第二个示例中。

$date = $item->getData('attribute_name'); //Value as String
$userDate = DateTime::createFromFormat('d/m/Y', $date);`

但问题的第一行开头是:

'D-M-Y'。示例 - > '20 -02-2019',作为字符串。

根据你提供的示例日期,你的输入你的createFromFormat不是'd / m / Y'(它是d-m-Y)

© www.soinside.com 2019 - 2024. All rights reserved.