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()
答案 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
,但需要第二个参数-past
或future
的字符串,并根据其偏移量。
<?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);
}