我想比較時間,我不完全確定處理此問題的最佳方法。比較時間:上午7點,上午5點或上午10點什麼時間接近?
我有次一個數組,它是聯合國能夠編輯。數組(「500」,「1100」,「1700」,「2300」);
500 =凌晨5:00等等
如果是6或早上7點,我可以運行什麼樣的邏輯來看看它是早上7點,什麼時間是上午05點接近上午10點還是?
我不認爲這是複雜的,但我只是想對我試圖破解的東西一起找出一個體面的解決辦法。
任何幫助或方向將不勝感激!
我想比較時間,我不完全確定處理此問題的最佳方法。比較時間:上午7點,上午5點或上午10點什麼時間接近?
我有次一個數組,它是聯合國能夠編輯。數組(「500」,「1100」,「1700」,「2300」);
500 =凌晨5:00等等
如果是6或早上7點,我可以運行什麼樣的邏輯來看看它是早上7點,什麼時間是上午05點接近上午10點還是?
我不認爲這是複雜的,但我只是想對我試圖破解的東西一起找出一個體面的解決辦法。
任何幫助或方向將不勝感激!
讓我們先從數組你有:
$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
時刻的差異。請注意,這一切都是在同一天和當地時間。
的差的兩倍
說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");
但你怎麼做「0700」 - 「0500」? – 2012-10-12 06:30:53
無論何時使用strtotime() - http://php.net/manual/en/function.strtotime.php,您都會在自從時代以來以秒爲單位返回的字符串中提到您的時間。這是一個可用於計算的數字 – vstrien
這裏是我的解決方案:
// 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]})";
我適應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
數學變得更有趣的價值'「0550」,「0615」 - - 接近6:00?我建議首先歸一化爲小數單位 - 例如5:50是5.83 - 如果它只是需要看哪個更接近.. – 2012-10-12 06:14:49