所以,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
所有的变量,这也将列出类型(数据/字符串/布尔)