StrToTime在

时间:2016-02-01 14:02:29

标签: php

所以我有这样的日期数组 -

$ 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需要一个字符串作为参数,这正是我传入的内容。

任何想法?

2 个答案:

答案 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');