我想显示最后一个三月。我正在使用以下代码,
date("Y-m-d",strtotime("last March"));
任何建议或参考都会非常有帮助。
$year = date('Y');
if (date('n') < 3) {
$year--;
}
$beginningOfLastMarch = mktime(0, 0, 0, 3, 1, $year);
date('M')
或者
date('n')
或者
date('m')
或者,如果你有约会
$mydate = "2010-05-12 13:57:01";
你可以这样
$month = date("m",strtotime($mydate));
m 月份的数字表示,前导零从 01 到 12
n 月份的数字表示,没有前导零 1 到 12
我找到了一种更好的方法来做到这一点,但将我的旧解决方案留在了底部,因为在某些用例中它可能仍然与某些人相关。
我找到了一个更好的解决我的问题的方法,它包括在 前面加上一个日期strtotime
,然后使用相对选择器。假设我想选择4th of March last year
. 我只是做:
strtotime('{THIS_YEAR}-03-04 last year');
显然,在处理这个字符串之前,我会{THIS_YEAR}
用date('Y')
. 这很有效,仅仅是因为我硬编码了我想要的值。03-04
作为4th of March
. 我可以用我喜欢的任何日期替换这些数字。
我想出了一个对我有用的解决方案,它实际上并不涉及编写任何复杂的算法或任何东西。它确实涉及稍微扩展strtotime
虽然的语法。
尽管 PHPstrtotime
并不完美(适用于所有用例),但我发现如果你将strtotime
' 结合在一起,那么你可以让它变得非常强大。
说如果我想选择4th of last month
,我真的不能这样做......strtotime
并不真正接受序数。即4th
。
但是,我可以做到first day of last month
,这非常接近。我所需要的只是改变这一天。
strtotime
允许 atime()
作为第二个参数传递。这意味着您可以strtotime
像这样链接:
$time = time();
$time = strtotime('first day of last month', $time);
$time = strtotime('+3 days', $time);
echo date('Y-m-d H:i', $time);
// I know we don't really need the initial `$time = time()`. It is there for clarity
这将为我们提供正确的时间:4th of last month
.
这就是一些语法糖的用武之地......
我们可以编写一个函数来接受由分隔符分隔的部分strtotime
字符串:
function my_strtotime($str, $time = null, $delim = '|'){
$time = ($time==null ? time() : $time);
foreach(explode($delim, $str) as $cmd){
$time = strtotime($cmd, $time);
}
return $time;
}
可以这样使用:
$str = 'first day of last month | +3 days';
echo date('Y-m-d H:i', my_strtotime($str));
我们终于得到它了。4th of last month
.
无需从explode
调用中去除空格,因为strtotime
已经处理了额外的空格。
这可以处理复杂的间隔,比如last year | first day of March | +9 days | 14:00
总是返回10th of March at 2pm last year
。
最好的事情是last year | first day of March | +9 days | 14:00
可以使用所需的值生成类似的字符串,例如
last year | first day of {MONTH} | +{DAYS-1} days | {TIME}
这可能需要额外的工作来改进它,但我只是想快速把它放在这里,所以它可以帮助其他人解决这个问题