2013-04-16 267 views
0

開始時間,結束日期和結束時間變量。開始日期和開始時間小於結束日期和結束時間驗證

日期變量被格式化yyyy-mm-dd

的時間變量被格式化hh-mm(但只在小時數字是可用的,例如分鐘總是00)

我可以將這些變量到我的數據庫沒有問題,但是在我之前,我想檢查開始日期和時間是否在結束日期和時間之前。我知道如何檢查時間是否較早,日期較早,但我無法一起檢查時間和日期,我希望得到任何幫助?

$_POST['start_time'] 
$_POST['end_time'] 
$_POST['start_date'] 
$_POST['end_date'] 

是變量和我如何抓住他們。

+1

參考:http://stackoverflow.com/q/3847736/2274209 – saveATcode

+0

也http://stackoverflow.com/q/961074/2274209 – saveATcode

+0

這是什麼,我問 – Ryan

回答

3
function getTime ($ymd, $hi) { 
    return strtotime($ymd." ".$hi); 
} 
if (getTime($_POST['start_date'], $_POST['start_time']) < getTime($_POST['end_date'], $_POST['end_time'])) { 
    echo "Ok!"; 
} 

只需將其轉換爲Unix的時間戳,然後比較。

+0

偉大的完美和簡單!對此,我真的非常感激! – Ryan

+0

(我希望你的格式是'hh:mm'而不是'hh-mm';否則你必須在函數中使用'str_replace(「 - 」,「:」,$ hi)' – bwoebi

+2

)我的答案是,如果您使用的是沒有DateTime對象的舊PHP版本,我認爲這是最好的答案,但我認爲最好是@Leonard Challis發佈的內容 – Chococroc

0

嘗試爆炸數組,然後使用mktime()函數將日期傳遞給秒。然後,只需比較兩個日期,稍後的秒數就越大。

list($strHour, $strMin) = explode('-', $_POST['start_time']); 
list($endHour, $endMin) = explode('-', $_POST['end_time']); 
list($strYear, $strMonth, $strDay) = explode('-', $_POST['start_date']); 
list($endYear, $endMonth, $endDay) = explode('-', $_POST['end_date']); 

$startSeconds = mktime($strHour, $strMin, 0, $strMonth, $strDay, $strYear); 
$endSeconds = mktime($endHour, $endMin, 0, $endMonth, $endDay, $endYear); 

if ($startSeconds > $endSeconds) { 
    echo 'Start is bigger'; 
} 
+0

你能給我一個我將如何使用它的例子嗎?在更新 – Ryan

+0

以查看示例之前,我從未使用過mktime()函數。我已經看到了其他答案,如果你可以使用對象作爲DateTime,使用它,但首先檢查PHP手冊中可能出現的問題,因爲你使用的PHP版本,因爲如果你使用的是舊版本的PHP,也許你沒有訪問權限(我記得我有一箇舊版本,我不能在生產中使用它)。關於strtotime,這是一個非常好的答案,但是您必須非常小心,因爲如果您沒有使用「正確的格式」,它可能會失敗:請檢查此答案 - > http://stackoverflow.com/questions/6919478/ph​​p-problem -with-strtotime – Chococroc

2

我會使用DateTime::createFromFormat()它。就像這樣:

$start = DateTime::createFromFormat('Y-m-d H-i', 
      $_POST['start_date'] . ' ' . $_POST['start_time']); 
+0

然後我可以比較$ start到$ end爲更大? – Ryan

+0

是的,您可以使用帶日期時間對象的比較運算符。 – hek2mgl

4

使用DateTime對象,使生活簡單的自己:

<?php 
// assuming the following values... 
$_POST['start_time'] = '06:00'; 
$_POST['end_time'] = '10:00'; 
$_POST['start_date'] = '2012-01-01'; 
$_POST['end_date'] = '2013-06-02'; 

//set up two DateTime objects 
$start = DateTime::createFromFormat('Y-m-d H-i', $_POST['start_date'] . ' ' . $_POST['start_time']); 
$end = DateTime::createFromFormat('Y-m-d H-i', $_POST['end_date'] . ' ' . $_POST['end_time']); 

// check if they're valid 
if ($start < $end) { 
    echo 'We are good...'; 
} else { 
    echo 'Something bad happened...'; 
} 

請記住,這裏假設你的$_POST ED值有效。如果您尚未將其消毒,請至少將其包裝在try/catch中。

+0

開叫者告訴他他有一個輸入時間格式hh-mm。有了這個,你的代碼將無法工作。這就是原來的問題,我建議使用'DateTime :: createFromFormat()' – hek2mgl

+0

如果他只是添加str_replace(' - ',':',$ _POST ['start_time'])?這樣,上面的解決方案是完美的 – Chococroc

+0

好抓@ hek2mgl,歡呼。我正在考慮改變使用str_replace,但我覺得使用'createFromFormat()'更漂亮,更易於閱讀。 – LeonardChallis

相關問題