【问题标题】:convert DateTime String to DateTime Object, returns boolean instead of object [duplicate]将 DateTime 字符串转换为 DateTime 对象,返回布尔值而不是对象 [重复]
【发布时间】:2019-10-29 00:27:48
【问题描述】:

编辑:@RiggsFolly 帮助解决了这个问题,我使用的日期时间格式是 H:i:00 而不是 H:i:s 。

我需要比较许可证的注册日期和到期日期,我将两个日期作为字符串存储在 ssms 中,并将它们作为字符串检索,当我想比较两者时,我尝试将两者都转换为 DateTime 对象,以便我可以使用date_diff()比较它们,但是由于某种原因我只能将到期日期转换为对象,注册日期总是返回布尔值。

所以我的代码的工作方式是,它首先检查 $expirydate 是否为空,如果不是,那么它将进入条件并创建 $datetime 作为 DateTime 对象,然后创建 var $datetime1 来转换$registrationdate 并存储它,并创建 var $datetime2 以对 $expirydate 执行相同的操作。之后,如果日期没有返回 false,那么它将使用 date_diff() 相互比较,然后创建 var $validityperiod 以正/负整数存储两个日期之间的天数差,例如+30 或 -3,它将用于向用户显示许可证到期还有多少天。

我很困惑,为什么两者都是字符串值,但只有一个可以转换为 DateTime 对象,而另一个返回布尔值?

我尝试了 3 个选项将 DateTime 字符串转换为 DateTime 对象:

  1. date_create() 但它也返回布尔值,用于注册和到期日期。

  2. date_create_from_format(),结果同上,都返回布尔值。

  3. 创建一个new DateTime() 对象并使用createFromFormat() 将其转换为DateTime 对象,但它只适用于到期日期而不是注册日期,这是我能得到的最接近的,因为它至少可以将到期日期转换为 DateTime 对象。

    //the string values from my db is:
    // $registrationdate= "13/06/2019 15:06:06";
    // $expirydate="14/06/2019 16:46:00";

    //this example uses the third option
    if ($expirydate != null || $expirydate != ''){
        // creates DateTime objects 
        $datetime = new DateTime();
        //the line below is the problem, it cant convert the string to object
        $datetime1 = $datetime->createFromFormat('d/m/Y H:i:00', $registrationdate); 
        //however, this line below works, although both are strings
        $datetime2 = $datetime->createFromFormat('d/m/Y H:i:00', $expirydate); 

        if ($datetime1!= false && $datetime2 != false){
            // calculates the difference between DateTime objects 
            $interval = date_diff($datetime1, $datetime2);  

            // printing result in days format 
            $validityperiod= $interval->format('%r%a'); 
        }
        else $validityperiod = "";
    }

每次从字符串到对象的转换返回布尔值时,都会返回如下错误:

警告:date_format() 期望参数 1 为 DateTimeInterface,给定布尔值

如果它可以将注册日期转换为 DateTime 对象,那么它应该能够运行 date_diff() 并且 $validityperiod 应该存储两个日期之间的天数差异

【问题讨论】:

  • 你试过 DateTime::createFromFormat('d/m/Y H:i:s', "13/06/2019 15:06:06"); ?第二个问题-您确定该值不为空吗?
  • '00' 不是有效的日期格式,请使用@PeliCan 建议的格式字符串,然后根据需要将秒设置为 0。
  • 见 JohnConde 的副本。

标签: php sql iis ssms


【解决方案1】:

你必须使用正确的格式

$datetime->createFromFormat('d/m/Y H:i:00', $expirydate); 

第二个意外工作,因为您的时间实际上以00 秒结束,因此格式匹配,即

$expirydate="14/06/2019 16:46:00";`
                // ---        ^^ 

但是第一个日期与:00 格式不匹配,因为它的秒数为06,即

$registrationdate= "13/06/2019 15:06:06";`
      //  -----------                ^^

因此,为两者使用正确的格式'd/m/Y H:i:s',您将获得正确创建的日期。

【讨论】:

  • 感谢它的工作!惊讶于你的观察力!我实际上将到期日期的秒数设置为 0 哈哈,我忘了将秒数格式更改为 s
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-13
  • 2021-07-30
  • 2011-09-21
  • 2018-10-19
  • 2013-10-18
  • 2019-06-28
  • 1970-01-01
相关资源
最近更新 更多