我正在编写一个脚本来查询“3个月前”的日期。当我在考虑确保我不会错过任何内容时,我将其用于比较:
$date = date("Y-m-d",mktime(0,0,0,date("m")-$months_ago,date("d")));
我意识到我有可能错过约会。例如,如果我在11月30日搜索三个月前的日期,我会得到8/30。但第二天是12/1,三个月前是9/1。所以在这个剧本中我错过了8/31。
我想最好的方法是使用天数(90天)而不是几个月。这是这样的最佳做法吗?
答案 0 :(得分:9)
直接使用strtotime('-3 month');
你也可以在mktime的月份参数上给出负数,例如-3,它会像魅力一样工作(更好的是第二个解决方案)。不,它不会跳过几天 - 如果“现在”是2011-06-17它将返回相当于2011-03-17的时间戳。
编辑: 嗯,实际上你可能错过了几天(我没有查看你的陈述),但毕竟你的时间单位是几个月,而不是几天。我所说的是,在公历月中并不是一成不变的时间 - 可能是28天,29天,30天或31天。
假设您要计算付费订阅期的月数。如果用户在2011-02-15支付一个月,他的订阅何时到期?我猜想2011-03-15,即使这两个日期之间只有28天如果他支付2011-03-15的订阅费用,他将在2011-04-15之前满31天,这似乎完全公平对我来说,订阅是“一个月”,这恰好是一年中不同的天数。
如果,在您的情况下,您不想“3个月前”但想要获得相对代表“3个月”的恒定时间,那么您可以使用中等月份长度 - 88.59天,或88天14小时10分钟。用代码表示的是:
strtotime('-88 days -14 hours -10 minutes');
答案 1 :(得分:3)
$when = strtotime('-3 months');
答案 2 :(得分:0)
如果您只需要月/年并且不想计算天数:
$m = 5; // how many months ago, for example
$now = time();
$cm = date("m",$now); // current month
$yr = date("Y",$now) - intval((12 + $m - $cm)/12);
$month = (($cm + 11 - ($m % 12) ) % 12) + 1;
echo "$m months ago: $month yr: $yr\n";