2010-12-22 90 views
7

所以,呃,好的。這可能爲數學,所以希望你帶的科學計算器與你同在)PHP查找與時間線最近的日期

這是我的問題:

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); 

其中寫道'03 2011' 年4月。它是如何達到3的? (我懷疑這是一個閏年問題?) 你知道這種感覺,當你失去一些小東西嗎?我感覺這一切在我現在....

+0

不像你,我測試你的代碼,我得到`04月01 2011`! – ncuesta 2010-12-22 12:33:30

+0

什麼?也許你應該看你的誣告。事實上,1991年4月1日也是錯誤的... – Christian 2010-12-22 12:34:53

+0

這些時期是他們設定的?他們會一直是多年還是那麼有活力?如果你只有幾年工作,你可以在年份工作,並且你是安全的。如果你需要工作幾天,你會得到這個閏年問題。 – Knubo 2010-12-22 12:37:23

回答

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

好了,所以如果我明白你問,你想知道將在出現下一個日期一段時間(在你的情況下,從1991年4月2日開始,每隔10年,下次日期:2011年4月2日)。

所以,你應該深入研究一下DateTime這個PHP類,它更好用於日期,因爲它更準確。你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

發生了什麼事:

+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); 
} 
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; 
    } 
}