2011-08-25 85 views
1

堆棧溢出社區,比較日期/時間 - PHP,XML,strtotime

我一直很感激你的智慧和幫助。這裏是我的情況:

這裏是我的XML文件中的一個片段(這是它的一個非常小的一部分):

<matchup id="1" date="09/08/11" time="7:30 PM"> 
     <away city="New Orleans">Saints</away> 
     <home city="Green Bay">Packers</home> 
     <finalscore> 
      <away></away> 
      <home></home> 
     </finalscore> 
    </matchup> 

好了,所以使用SimpleXML我收到此XML數據並存入各自的PHP變量。我唯一需要幫助的是日期/時間部分。

我想基本上比較比賽的日期/時間與當前時間。如果比賽的時間已經過去了(或者爲此開始),我想要顯示不同的輸出。

因此,這裏是我的PHP的事,但工作不正常的位置:

foreach($week->matchup as $matchup) 
{ 
$game_time = $matchup['time']; 
$game_date = $matchup['date']; 

date_default_timezone_set('US/Eastern'); 
$game_date2 = strtotime($game_date); 
$game_date3 = date('m/d/y', $game_date2); 
$time_stamp = strtotime($game_time); 
$check = date("g:i A", $time_stamp); 
$date_now = date('m/d/y'); 
$time_now = date('g:i A'); 

if ($game_date3 >= $date_now && $check >= $time_now) { 

?> 
<tr> 
<td class="two"><?php echo $game_date ?></td> 
<td class="two"> 
<input type="radio" id="<?php echo $away_city ?> <?php echo $away_teamname ?>" class="radio" name="<?php echo $week_name ?>" value="<?php echo $away_city ?> <?php echo $away_teamname ?>"></input> 
    <?php echo $away_full ?> 
</td> 
<td class="two"> 
<input type="radio" id="<?php echo $home_city ?> <?php echo $home_teamname ?>" class="radio" name="<?php echo $week_name ?>" value="<?php echo $home_city ?> <?php echo $home_teamname ?>"></input> 
    <?php echo $home_full ?> 
</td> 
<td class="two"><?php echo $game_time ?></td> 
</tr> 
<?php 
} else { 
?> 
<tr> 
<td class="two"><?php echo $game_date ?></td> 
<td class="two"> 
<span><?php echo $away_full ?></span> 
</td> 
<td class="two"> 
<span><?php echo $home_full ?></span> 
</td> 
<td class="two"><?php echo $game_time ?></td> 
</tr> 
<?php 
} 
    } ?> 

正如你所看到的,我所要做的就是簡單地檢查是否從XML中的日期/時間過去當前時間的時間。如果是這樣,我想顯示一個沒有輸入單選按鈕的輸出。如果它沒有超過當前時間,我想顯示輸出WITH輸入單選按鈕。

我認爲問題是在我的變量設置與strtotime並獲取XML日期/時間正確解析服務器時間的某處。

我希望有人能幫我弄明白這一點!此外,任何建議,以使這更簡潔和安全也讚賞。

+0

我想這就是我問那麼......是什麼語法看起來喜歡做的事是什麼? 我會從XML中取出日期/時間...將其轉換爲PHP變量並使用strtotime將它們壓縮成時間戳...然後我將該時間戳記與當前時間戳進行比較?這就是你說的嗎?感謝您的建議...保持它的到來:) –

+0

你是一個螺柱,我會檢查出來。 –

回答

0

您無法比較日期字符串。您需要使用strtotime然後比較它們將它們轉換爲時間戳。

像這樣:

$date = '09/08/11 7:30 PM'; 

if (strtotime($date) < time()) { 
    // $date is in the past 
} 
你的情況

所以:

$game_time = $matchup['time']; 
$game_date = $matchup['date']; 
$date = "{$game_date} {$game_time}"; 

if (strtotime($date) < time()) { 
    // $date is in the past 
} 
+1

我相信你剛剛爲我嘲笑的東西正在起作用。聽起來合乎邏輯和正確。我會知道一旦我插入! :)我會先發制人說你是我的英雄。 –

+0

此解決方案工作!你是我的英雄。我可以說一個事實。你是一個野獸! –

+0

如果它適合你,請不要聲明我是英雄,upvote並接受答案。 :) – netcoder

0

我會警告不要使用舊的日期功能,並建議您使用DateTime類。對於上面的你應該看DateTime::createFromFormat();

所以,你會是這樣的:

$game_date2 = DateTime::createFromFormat('d/m/Y H:i:s', $game_date); 
$game_date3 = new DateTime(); 

if($game_date2 > $game_date3) { 
    echo 'game yet to be played'; 
} 

注意你至少需要PHP5.2.2能夠比較日期對象,如在我上面的代碼。有關更多信息,請參閱DateTime::diff() page

+0

你是說舊的日期函數是什麼可能導致我從XML解析日期/時間的麻煩? –

+0

好吧,既然你添加了代碼... 新的DateTime()會得到當前時間嗎?所以$ game_date3是當前時間... DateTime :: createFromFormat會正確解析我的XML數據並用於比較嗎?我想我必須給這個鏡頭才能知道。 –

+0

@JohnStamos請看我編輯的答案,我已經提供和例子。我更願意明確說明我正在轉換日期的格式。至於使用DateTime,我認爲這是一個很好的習慣,因爲它更靈活。 – Treffynnon