【问题标题】:PHP Find date nearest to a timeline periodPHP查找最接近时间线的日期
【发布时间】:2010-12-22 21:23:03
【问题描述】:

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

这是我的问题:

给定初始日期(时间戳)、时间段(秒)和今天的日期(时间戳),我需要找到与 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? (我怀疑这是闰年问题?) 当你错过一些小东西时,你知道那种感觉吗?我现在感觉这一切都在我身上......

【问题讨论】:

  • 与你不同,我正在测试你的代码,我得到了01 Apr 2011
  • 什么?!也许你应该注意你的诬告。事实上,1991 年 4 月 1 日也是错误的......
  • 他们设置的时间段?它们会永远是几年还是动态的?如果您只使用年份,您可以只在年份部分上工作,并且您在家安全。如果你需要用天工作,你会得到这个闰年的问题。
  • 诬告?我刚刚运行了您的代码并与您分享了结果。
  • @ncuesta - 我运行(tested)该代码并得到了这些结果,我清楚地说明了这一点。我不只是“发明”那个日期。 @Knubo - 是的,这就是为什么它是 strtotime。将来人们应该将它们混合在一起,例如+1 year 2 months

标签: php date range period


【解决方案1】:

好的,如果我理解您的要求,您想知道在给定时间段内将发生的下一个日期(在您的情况下,从 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 !
?>

【讨论】:

  • 与其他人的问题相同的问题,数学实现与循环。
  • 非常适合我。只有一件事:在最后一行,应该是echo $initial-&gt;format('d M Y');
  • @Christian Sciberras:你可以尝试在 Date 对象上做你的数学系统:round(($now-$initial)/$interval) * $interval。我现在无法测试它,所以我无法确认它会起作用。或者,您必须在每个变量中为您的数学方式添加 -&gt;getTimestamp()。 (去测试)。告诉我它是否有效,我将编辑我的答案。
  • 请注意,这将找到最近的日期 before 现在,而不是最近的日期之前或之后。这就像在原始问题中运行 floor 而不是 round
  • 是的,你是对的@lonesomeday,我误解了最近和“最近”
【解决方案2】:

试试这个:

$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 April 1991。我正在采用一种比通过循环更数学的方法(在更高的范围内往往会变得昂贵)。我应该让它在每月和每周的检查中也能正常工作,这让它变得很慢。
【解决方案3】:

发生了什么:

+10 years 来自 0 年 (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);
}

【讨论】:

  • 啊!我得到它。应该是:strtotime('+1 years',0)*10
  • @Christian Sciberras 不! :) 稍等片刻,然后使用strtotime 添加。我发布了一些样机代码。如果您这样做strtotime('+1 years',0)*3,您将获得所需的 5 天时间。 (大概是 3 月 28 日。)
  • while 正是我写的,但 Christian 正在寻找解决这个问题的数学方法。
【解决方案4】:

作为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;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-26
    • 1970-01-01
    • 1970-01-01
    • 2017-06-30
    • 2018-06-04
    • 1970-01-01
    • 2015-02-08
    • 2020-10-02
    相关资源
    最近更新 更多