PHP - 日期为错误的数据类型

时间:2011-12-08 20:19:43

标签: php datetime

所以,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"
}

5 个答案:

答案 0 :(得分:1)

正如手册中所述,date_create()DateTime::__construct()的别名。我们可以阅读:

  

返回值
返回新的DateTime实例。程序样式在失败时返回FALSE。

所以很明显布尔来自何处。

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

  • Unix时间戳:它是一个整数,计算自Unix Epoch(1970年1月)以来的秒数。它是传统日期函数处理的值,它接收一个整数作为参数或返回一个。

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

  • 字符串:它不是标准格式本身,因此它只能用于显示目的或作为中间格式(例如,将日期插入数据库)。

可悲的是,DateTime构造函数只接受字符串,甚至不允许告诉确切的格式(恕我直言,一个没有深思熟虑的设计决定)。为了减少潜在的歧义(11月10日或10月11日10/11/2011),我建议您使用"YYYY-MM-DD"格式。

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

答案 1 :(得分:1)

我知道这可能会过时,但我认为以下内容可能对您有所帮助,它帮助了我......

 $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

答案 2 :(得分:0)

使用var_dump()检查您的类型。看看这说:

var_dump(strtotime($bar));

答案 3 :(得分:0)

您应该在设置之前和之后var_dump($test, $bar)查看您是否确实有日期。我会假设日期已创建,因为您没有提及$bar->diff($test)抛出任何“非对象”错误的任何内容。假设您所讨论的布尔值是调用before()的结果,那么当您执行返回布尔值的操作时,这是预期的。

答案 4 :(得分:0)

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

尝试var_dump所有变量,这也会列出类型(data / string / boolean)