PHP查找最接近时间轴周期的日期

时间:2010-12-22 12:23:04

标签: php date range period

所以,呃,好的。这可能是数学的,所以希望你随身携带科学计算器;)

这是我的问题:

alt text

给定一个初始日期(时间戳),时间段(秒)和今天的日期(时间戳),我需要找到最近的日期,它与周期* n加上原始/初始日期一致。

到目前为止,我得到了一些很好的工作,例如初始和最终(今天)日期之间的“句点”数量,在上面的演示中为“2”:

$initial=strtotime('2 April 1991');
$time=time();
$period=strtotime('+10 years',0);

$periods=round(($time-$initial)/$period);

接下来我做的是:

$range=$periods*$period;

最后:

echo date('d M Y',$initial+$range);

其中写道'2011年4月3日'。怎么到3? (我怀疑这是闰年问题?) 当你遗失一些小东西时,你知道那种感觉吗?我现在感觉到这一切......

4 个答案:

答案 0 :(得分:2)

好的,如果我明白你在问什么,你想知道在给定时间内会发生的下一个日期(在你的情况下,从1991年4月2日开始,每10年一次,这将是下一个日期: 2011年4月2日)。

因此,您应该深入了解PHP中的DateTime类,它更适合日期使用,因为它更准确。您可以将其与DateInterval混合,使其与您所需的完全匹配:

<?php
$interval = new DateInterval('P10Y'); // 10 years
$initial = new DateTime('1991-04-02');
$now = new DateTime('now');

while ($now->getTimestamp() > $initial->getTimestamp()) {
    $initial = $initial->add($interval);
}

echo $initial->format('d M Y'); // should return April 2, 2011 !
?>

答案 1 :(得分:1)

试试这个:

$current = $initial = strtotime('2 April 1991');
$time_span = '+10 years';

while ($current < time())
{ 
  $current = strtotime($time_span, $current);
}

echo date('d M Y', $current);

答案 2 :(得分:1)

发生了什么:

来自 0年(1970)的

+10 years将包括'闰年'72,'76和'80,但从'91到'11,只有五个闰年'92 ,'96,'00,'04和'08。你把这个时期加了两次,所以因为没有6个闰年你再多加一天。

您需要做什么:

一次只用strtotime一段时间。

$period = "+10 years";
$newTime = $startingTime;
while(<condition>){
    $newTime = strtotime($period, $newTime);
}

答案 3 :(得分:0)

作为cx42net's answer的修正:

<?php

$initial = new DateTime('2 April 1991');
$now = new DateTime('now');
$interval = new DateInterval('P10Y');

$curDate = $initial;

while (true) {
    $curDate = $curDate->add($interval);

    $curDiff = $curDate->diff($now)->days;

    if (isset($lastDiff) && ($curDiff > $lastDiff)) {
        echo $lastDate->format('d M Y');
        break;
    } else {
        $lastDate = clone $curDate;
        $lastDiff = $curDiff;
    }
}