2012-10-12 215 views
0

我想比較時間,我不完全確定處理此問題的最佳方法。比較時間:上午7點,上午5點或上午10點什麼時間接近?

我有次一個數組,它是聯合國能夠編輯。數組(「500」,「1100」,「1700」,「2300」);

500 =凌晨5:00等等

如果是6或早上7點,我可以運行什麼樣的邏輯來看看它是早上7點,什麼時間是上午05點接近上午10點還是?

我不認爲這是複雜的,但我只是想對我試圖破解的東西一起找出一個體面的解決辦法。

任何幫助或方向將不勝感激!

+0

數學變得更有趣的價值'「0550」,「0615」 - - 接近6:00?我建議首先歸一化爲小數單位 - 例如5:50是5.83 - 如果它只是需要看哪個更接近.. – 2012-10-12 06:14:49

回答

2

讓我們先從數組你有:

$values = array("500", "1100", "1700", "2300"); 

我們想要的是將其格式化爲有效的時間字符串,很容易,我們只需在正確的位置插入「:」。對於我創建了一個功能:

function Format($str) 
{ 
    $length = strlen($str); 
    return substr($str, 0, $length - 2).':'.substr($str, $length - 2); 
} 

現在我們可以,我們可以轉換爲UNIX時間strtotime有效的字符串。現在的問題是找到更接近當前時間(我們得到time

所以,我們可以遍歷數組,轉換它們,計算差異與當前時間(以絕對值),並選擇一個導致較低的數字。下面是代碼:

$now = time(); //current time 
$best = false; 
$bestDiff = 0; 
for ($index = 0; $index < count($values); $index++) 
{ 
    $diff = abs($now - strtotime(Format($values[$index]))); 
    if ($best === false || $diff < $bestDiff) 
    { 
     $best = $index; 
     $bestDiff = $diff; 
    } 
} 

它會留下的接近時間$best指標,並與計算的$bestDiff時刻的差異。請注意,這一切都是在同一天和當地時間。

0

的差的兩倍

說07:00之間的絕對值 - 05:00 02:00 =,的02:00絕對值仍然02:00

07:00 - 10 :00 = -03:00,-03絕對值:00 03:00

在PHP中您可以使用您的strtotime時間字符串轉換爲秒:

$time_one = strtotime("07:00"); 
$time_two = strtotime("05:00"); 
$time_three = strtotime("09:00"); 
+0

但你怎麼做「0700」 - 「0500」? – 2012-10-12 06:30:53

+0

無論何時使用strtotime() - http://php.net/manual/en/function.strtotime.php,您都會在自從時代以來以秒爲單位返回的字符串中提到您的時間。這是一個可用於計算的數字 – vstrien

0

這裏是我的解決方案:

// Input data 
$values = array("500", "1100", "1700", "2300"); 
$time = "12:15"; 

// turns search time to timestamp 
$search = strtotime($time); 

// turns "500" to "5:00" and so on 
$new = preg_replace('/^(\d?\d)(\d\d)$/','\1:\2', $values); 

// converts the array to timestamp 
$new = array_map('strtotime', $new); 

// sorts the array (just in case) 
asort($new); 

// Some initialization 
$distance = $closest = $result = $result_index = NULL; 

// The search itself 
foreach($new as $idx => $time_stamp) 
{ 
     $distance = abs($time_stamp - $search); 
     if(is_null($closest) OR $closest > $distance) 
     { 
       $closest = $distance; 
       $result_index = $idx; 
       $result = $time_stamp; 

     } 
} 
echo "The closest to $time is ".date('H:i', $result)." ({$values[$result_index]})"; 
2

我適應Theraot的解決方案,通過該值的距離排序的數組到當前時間:

<?php 
$values = array("500", "1100", "1700", "2300"); 
$now = time(); 

/** 
* Format an integer-string to a date-string 
*/ 
function format($str) 
{ 
    $length = strlen($str); 
    return substr($str, 0, $length - 2).':'.substr($str, $length - 2); 
} 

/** 
* Callback to compare the distance to now for two entries in $values 
*/ 
$compare = function ($timeA, $timeB) use ($now) { 
    $diffA = abs($now - strtotime(format($timeA))); 
    $diffB = abs($now - strtotime(format($timeB))); 
    if ($diffA == $diffB) { 
     return 0; 
    } 
    return ($diffA < $diffB) ? -1 : 1; 
}; 

usort($values, $compare); 

print_r($values); 

你期望的結果是在$值[0]現在。 請注意,此解決方案需要PHP版本> = 5.3

相關問題