0

我想显示最后一个三月。我正在使用以下代码,

 date("Y-m-d",strtotime("last March"));

任何建议或参考都会非常有帮助。

4

3 回答 3

6
$year = date('Y');
if (date('n') < 3) {
    $year--;
}

$beginningOfLastMarch = mktime(0, 0, 0, 3, 1, $year);
于 2012-04-09T05:15:00.160 回答
2

http://php.net/date

date('M')

或者

date('n')

或者

date('m')

或者,如果你有约会

$mydate = "2010-05-12 13:57:01";

你可以这样

$month = date("m",strtotime($mydate));

m 月份的数字表示,前导零从 01 到 12

n 月份的数字表示,没有前导零 1 到 12

于 2012-04-09T05:01:21.363 回答
0

我找到了一种更好的方法来做到这一点,但将我的旧解决方案留在了底部,因为在某些用例中它可能仍然与某些人相关。

我找到了一个更好的解决我的问题的方法,它包括在 前面加上一个日期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}

这可能需要额外的工作来改进它,但我只是想快速把它放在这里,所以它可以帮助其他人解决这个问题

于 2016-01-15T11:01:43.157 回答