我可以使用strtotime()来获取上个月某一天的时间戳,如果不是,最有效的方法是什么?
这就是我想要的东西
strtotime("5 last Month");
而不是
$time_day= 5;
$time_month= date("m");
$time_year= date("Y");
if($time_month<1){
$time_month=12;
$time_year--;
}else{
$time_month--;
}
$date=mktime(0,0,0,$time_month,$time_day,$time_year);
答案 0 :(得分:6)
在PHP中使用strtotime()
目前无法实现您想要做的事情。以下是如何使用mktime()
和date()
在一行中实现您想要的内容:
$timestamp = mktime(0, 0, 0, date('n') - 1, 21);
上面的代码会找到上个月第21天日的时间戳。只需交换21
即可。
这是因为:
小于1的值(包括负值)以相反的顺序引用上一年的月份,因此0表示12月,-1表示11月,等等。[PHP Documentation]
因此,如果月份为1
(1月),那么您将使用mktime()
作为月份值运行0
,这意味着“上一年的12月”。
答案 1 :(得分:1)
答案 2 :(得分:0)
首先,我需要纠正一个小错误:
if($time_month<1) // If month==0
{
$time_month=12; // New month==12
$time_year--;
}
这样,有13个月......(0,1,2,3,4,5,6,7,8,9,10,11,12)。 Date指定date("m")
从1到12,然后该代码应为:
if($time_month==1) // If month==1
{
$time_month=12; // New month==12
$time_year--;
}
还有第二个想法,我不打算再尝试优化它。请记住premature optimization is the root of all evil。如果您的代码有效并且相对较短(在这种情况下),最好的方法就是保持这种方式。认为即使有一个功能可以做你想做的事情,唯一的区别是你不必自己编写代码,但后台进程会非常相似所以没有那么多优化(关于速度/资源)。
另外,我建议写一两行评论,说明它的作用。如果您想在一年左右的时间内重复使用它,那么理解代码会很有用。
最后一个想法。不同的月份有不同的日子。我不确定您的代码是用于手动输入还是取决于当天,但如果您编写day="31";
并且date("m")
是03,会发生什么?
看看这个:Link。它以这种方式工作:
<?php
$date = new DateTime('2000-01-20');
$date->sub(new DateInterval('P10D')); // 10 days ago
echo $date->format('Y-m-d') . "\n";
?>
将输出2000-01-10