7

所以,嗯,好的。这可能是数学问题,所以希望你带上你的科学计算器;)

这是我的问题:

替代文字

给定初始日期(时间戳)、时间段(秒)和今天的日期(时间戳),我需要找到与 period*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

4 回答 4

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 !
?>
于 2010-12-22T12:37:59.907 回答
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);
于 2010-12-22T12:36:19.197 回答
1

发生了什么:

+10 years0年(1970 年)将包括 3 个闰年 '72、'76 和 '80,但从 '91 到 '11 只有五个闰年 '92、'96、'00、'04 和 '08。您将该期间添加了两次,所以因为没有 6 个闰年,所以您多了一天。

你需要做什么:

广告期间strtotime一步一步。

$period = "+10 years";
$newTime = $startingTime;
while(<condition>){
    $newTime = strtotime($period, $newTime);
}
于 2010-12-22T12:38:54.293 回答
0

作为对cx42net 答案的修复:

<?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;
    }
}
于 2010-12-22T13:23:03.547 回答