所以我有这样的日期数组 -
$ monthsArray的内容
2015-02-01
2015-03-01
2015-04-01
2015-05-01
2015-06-01
2015-07-01
2015-08-01
2015-09-01
2015-10-01
我想循环遍历数组并从每个日期开始减去一年 -
foreach ($monthsArray as $month)
{
$ytdFrom = date("$month", strtotime('-1 year'));
$ytdTo = $month;
}
$ ytdFrom的第一个循环的值仍为= 2015-02-01 ,依此类推,ytdFrom不会减去一年。
虽然如果运行以下代码 -
$ytdFrom= date('Y-m-d',strtotime('-1 year')); // Todays date 2016-02-01
这将= 2015-02-01。
我不明白为什么会发生这种情况,strToTime需要一个字符串作为参数,这正是我传入的内容。
任何想法?
答案 0 :(得分:2)
date
函数首先采用您希望它输出字符串的格式,然后是您想要格式化的日期。 strtotime
占用您想要格式化的时间,并为函数开始时间(unix timestamp)提供可选的第二个参数。如果未指定,则为当前时间。所以对于演示:
echo date('y-m-d', strtotime('-1 year', strtotime('2015-03-01')));
输出:
14-03-01
因为它是2015-03-01
之前的一年。
PHP演示:https://eval.in/511126
在哪里,
echo date('y-m-d', strtotime('-1 year'));
输出为15-02-01
。因为在今天之前是1 year
。
...所以总结你真的想要:
echo date('y-m-d', strtotime('-1 year', strtotime($month)));
并将date
值修改为您想要的任何格式; http://php.net/manual/en/function.date.php
答案 1 :(得分:0)
是的,问题是strtotime
根据实际时间返回值。这就是strtotime('-1 year')
返回2015-02-01
的原因。
但是你需要从你的日期减去一些间隔,这就是这个函数:http://php.net/manual/en/function.date-sub.php。
从我的观点来看,使用DateTime
对象执行此操作的最佳方法(但您仍然可以使用像date_*
这样的过程样式),如下所示:
(new DateTime('2016-02-01'))
->sub(DateInterval::createFromDateString('1 year'))
->format('Y-m-d');