日期是错误的数据类型


PHP - Date as Wrong Data Type

所以,PHP今天显然感觉像个白痴。也许是我的问题。或者两者兼有。

function before($test,$bar) {
    $test   = date_create($test);
    $bar    = date_create($bar);
    $diff   = date_diff($bar,$test);
    $diff   = $diff->format('%r%a') * 1;
    return $diff<0;
}

它拒绝接受以下方式生成的日期:

date('m-d-Y', strtotime($date));

…是一个布尔值!如果我输出结果,它是一个字符串,但是- PHP倾向于让我困惑- before()把它当作它不是的东西。这里没有任何东西可以将其转换为布尔值。我可以直接给它一个字符串,它工作得很好。给它一个日期,从一段代码专门为这个目的,嗯,我们不能有,因为…

Warning: date_diff() expects parameter ... to be DateTime, boolean given

我想,"好吧,我会给你解析器的愿望。"

function before($test,$bar) {
    $test   = new DateTime(date('Y-m-d',strtotime($test)));
    $bar    = new DateTime(date('Y-m-d',strtotime($bar)));
    $diff   = $bar->diff($test);
    $diff   = $diff->format('%r%a') * 1;
    return $diff<0;
}

结果没有任何变化。我给了它想要的,或者至少是它它想要的(我想),它仍然拒绝我。模拟现实编程

我还不太习惯约会。对于PHP如何处理一年中的时间,我也不是很满意。任何建议吗?也许该怎么让这个也起作用呢?

编辑

运行var_dump($test)

object(DateTime)#7 (3) {
  ["date"]=>
      string(19) "1970-01-01 00:00:00"
  ["timezone_type"]=>
      int(3)
  ["timezone"]=>
      string(13) "Europe/Berlin"
}

如手册中所述,date_create()是DateTime::__construct()的别名。这里我们可以读到:

返回值
返回一个新的DateTime实例。过程式失败时返回FALSE。

很明显布尔值的来源了

现在,您的代码显示了从Unix时间戳到字符串的许多转换,反之亦然,但没有显示您开始的值,因此不可能指出问题的确切来源。但是我要说的是,您对日期处理中涉及的数据类型有一定的困惑。这里有一个小总结:

  • Unix时间戳:它是一个整数,计算从Unix纪元(1970年1月)开始的秒数。它是由接收整数作为参数或返回整数的旧日期函数处理的值。

  • DateTime:这是PHP/5.2中引入的新的面向对象日期特性。

  • 字符串:它本身不是一种标准化格式,所以它应该只用于显示目的或作为中间格式(例如,在数据库中插入日期)。

遗憾的是,DateTime构造函数只接受字符串,甚至不允许告诉确切的格式(恕我直言,这不是一个深思熟虑的设计决策)。为了减少潜在的歧义(10/11/2011是10th november还是11 Oct?),我建议您使用"YYYY-MM-DD"格式。

提示:决定是使用时间戳还是DateTime对象,并坚持使用。这会让你的生活更轻松。

我知道它可能很过时,但我认为以下可能对你有帮助,它对我有帮助…

 $interval = date_diff(date_create($strStartDate), date_create($strEndDate));
 echo $interval->format('%R%a days');

,

 $strStartDate = your starting date
 $strEndDate = your ending date

$interval将返回差值,下面的格式语句将根据差值插入+-

我希望这对你有帮助

Husnain

var_dump()检查你的类型。看看这是怎么说的:

var_dump(strtotime($bar));

您应该在设置它们之前和之后设置var_dump($test, $bar),以查看您是否实际上有日期。我假设日期已经创建,因为您没有提到$bar->diff($test)抛出任何"非对象"错误。假设您正在谈论的布尔值是调用before()的结果,这是预期的,因为您正在做一个返回布尔值的操作。

new DateTime($var);在无法理解输入时返回false

尝试var_dump所有的变量,这也将列出类型(数据/字符串/布尔)