【问题标题】:Comparing different date format than US to another date将不同于美国的日期格式与另一个日期进行比较
【发布时间】:2019-02-20 09:53:00
【问题描述】:

我们基本上有一个日期格式,例如:'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


    【解决方案1】:

    劳尔。

    如果你想给一个日期加天,你应该在字符串上然后把它转换成DateTime:

    如果我没记错的话,你有 3 个日期:

    • 来自$item-&gt;getData('attribute_name'); 作为String的那个
    • 来自$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 以检查它是否介于其他两个之间,但您可以随意比较它们。

    希望对你有帮助

    【讨论】:

      【解决方案2】:

      取决于 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)

      【讨论】:

      • 我的错,问题中写错了,我只是修复它。我尝试输入 dd/mm/yyyy 但这也不能解决问题,结果给了我 bool(false)。
      • 哪个结果为假?使用您提供的第二个示例,我确实得到了一个有效的 DateTime 对象,输入为 Example -> '20/02/2019' 不要使用 date_create 在这种情况下它是不可靠的。从格式创建它可以让您更好地控制正在发生的事情,所以这始终是我的选择。
      猜你喜欢
      • 2020-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多