只有PHP strtotime的未来日期()

时间:2016-08-09 14:29:00

标签: php strtotime

PHP的strtotime()默认使用当前年份。如何获得未来的日期?

echo date('l d. M Y', strtotime('first sunday of april')); // Sunday 03. Apr 2016

我无法在4月的第一个星期天获得 next 。日期不得过去,且必须始终是相对的(2017年或2018年不加硬编码)。

echo date('l d. M Y', strtotime('first sunday of next april')); // fails

echo date('l d. M Y', strtotime('first sunday of april next year')); // wrong from January until that Sunday in April

我想我可以分多步完成或创建一个功能来检查,如果当前时间是在第一个星期日之前/之后,并在结束时插入“明年”。

但我想知道是否有一个简单的解决方案与strtotime()

3 个答案:

答案 0 :(得分:3)

我不认为这是特别优雅,但它有效,我希望它是你想要的?

echo date('l d. M Y', strtotime('first sunday of april', strtotime('first day of next year')));

然而,这似乎是一个更好,可维护,可读的解决方案

$d = new DateTime();
$d->modify( 'first day of next year');
echo $d->format('l d. M Y') . PHP_EOL;
$d->modify( 'first sunday of april');
echo $d->format('l d. M Y') . PHP_EOL;

哪个给出了

Tuesday 01. Aug 2017
Sunday 02. Apr 2017

年度更改日期的回声,您不需要做,它只是为了证明年份发生了变化

答案 1 :(得分:0)

我是来这里寻找帖子标题的解决方案的。我想每次获取strtotime结果的未来日期。

date("Y-m-d", strtotime("Jan 2"));

如果今天的日期是2018年1月1日,它将返回未来的日期2018-01-02,但是如果今天的日期是2018年1月3日,它将返回相同的日期(现在是过去的日期)。在这种情况下,我希望返回2019-01-02。

我知道OP表示他们不想要功能,但这似乎是最简单的解决方案。因此,这是我获得的下一个将来匹配的strtotime的快速功能。

function future_strtotime($d){
    return (strtotime($d)>time())?strtotime($d):strtotime("$d +1 year");
}

使用...获得美好的约会

date("Y-m-d", future_strtotime("Jan 2"));

答案 2 :(得分:0)

这是一个更强大的解决方案。它替换了strtotime,但需要第二个参数-pastfuture的字符串,并根据其偏移量。

<?php
function strtotimeForce($string, $direction) {
    $periods = array("day", "week", "month", "year");
    if($direction != "past" && $direction != "future") return strtotime($string);
    else if($direction == "past" && strtotime($string) <= strtotime("now")) return strtotime($string);
    else if($direction == "future" && strtotime($string) >= strtotime("now")) return strtotime($string);
    else if($direction == "past" && strtotime($string) > strtotime("now")) {
        foreach($periods as $period) {
            if(strtotime($string) < strtotime("+1 $period") && strtotime($string, strtotime("-1 $period"))) {
                return strtotime($string, strtotime("-1 $period"));
            }
        }
        return strtotime($string);
    }
    else if($direction == "future" && strtotime($string) < strtotime("now")) {
        foreach($periods as $period) {
            if(strtotime($string) > strtotime("-1 $period") && strtotime($string, strtotime("+1 $period")) > strtotime("now")) {
                return strtotime($string, strtotime("+1 $period"));
            }
        }
        return strtotime($string);
    }
    else return strtotime($string);
}