在php命令中计算日期操作。
php > echo $d = date('Y-m-d');
2019-07-26
php > echo date("Y-m-d",strtotime("$d -1 day"));
2019-07-25
使用上面的php代码,日期2019-07-26
减去1天=2019-07-25
。
为什么不能将两个命令合并为一个,例如下面的php代码?
php > echo date("Y-m-d",strtotime("date('Y-m-d') -1 day"));
1970-01-01
为什么不能用它的表达式date('Y-m-d')
替换日期变量$d
?
这是一个字符串"date('Y-m-d') -1 day"
- 出于明显的安全原因,字符串中包含的函数不会自动执行... (你可以用eval
但这是另一天的另一个话题)。 否则,如果他们这样做,您可以非常轻松地劫持服务器,实际上许多漏洞利用使用诸如eval()
或 Regex 的e
修饰符之类的东西(由于这个原因,现在从 PHP7 开始被删除)通过 PHP 执行字符串中包含的任意代码。
因此,只要问问自己自 1970 年以来文字字符串的时间是多少秒"date('Y-m-d') -1 day"
如果你回答我不知道,那么 PHP 也不知道。
就个人而言,我会为此放弃程序功能并这样做:
echo (new DateTime)->modify('-1 day')->format('Y-m-d');
输出
2019-07-24
沙盒
如果你真的想使用Date函数和过程样式,那么这将完成这项工作
echo date('Y-m-d', strtotime(date('Y-m-d').' -1 day'));
在这里,我将内部date
函数调用的输出与字符串' -1 day'
连接(.
),当它全部由PHP放在一起时,它看起来像这样2019-07-25 -1 day
。 这是日期函数理解并将起作用的内容。
可能让你(还有另一件事要理解)是变量插值(双引号内的变量被 PHP 替换)。
date("Y-m-d",strtotime("$d -1 day")); //$d is replaced by value
我喜欢在执行此操作时使用{}
,它更容易阅读(基本上它在我的 IDE 中看起来更好),您可以将其与属性等一起使用。 像这样:echo "foo {$this->name}"
,没有括号就不起作用。对象的方法也可以使用括号,例如$D=new DateTime; echo "today is {$D->format('Y-m-d')}"
。
现在,不幸的是,日期函数不是变量,因此插值不适用于它(由于我上面提到的原因):
"date('Y-m-d') -1 day"
所以你在第一个例子中看到$d
最终结果是这样的2019-07-25 -1 day
- 这几乎就是我上面所说的...... 前面(你的第二个示例)是上面的代码块中的内容(字面意思)。
干杯!
附言。 我喜欢说"插值",因为它让我听起来很聪明......哈哈。