2012-02-06 63 views
1

我想在Yii編寫一個驗證規則,但無法獲得日期比較工作。如果End不大於過去Start的30天,則想要顯示錯誤消息。日期加上30天驗證

public function checkDate($attribute,$params) 
    { 
     $duration = strtotime(date('Y-m-d', strtotime($this->Start)) . ' +30 days'); 
     if ($this->End < $duration) 
       $this->addError('End','30 days or more!'); 
    } 

有了這個每個輸入產生的錯誤信息。我使用的是MySQL數據庫,並開始和結束都是date格式

編輯: 下面給出我已經試過

這樣,即使現在不顯示頁面中的答案輸入。

$startDate = $this->Start; 
    $endDate = $this->End; 
    $interval = $startDate->diff($endDate); 
    if ($interval < 30) 
       $this->addError('End','30 days or more!'); 

這給出了誤差的100%的時間。

$duration = date('Y-m-d', strtotime($this->Start . '+ 30 days')); 
if ($this->End < $duration) 
    $this->addError('End','30 days or more!'); 
+0

小心使用strtotime來驗證e用戶輸入見[strtotime Php手冊](http://php.net/manual/en/function.strtotime.php)'時間戳的有效範圍通常是從1905年12月13日星期五20:45:54 UTC到星期二,2038年1月19日03:14:07 UTC.'如果你可以使用php [日期時間](http://www.php.net/manual/en/class.datetime.php) – Henesnarfel 2012-02-06 18:47:10

+0

介意解釋爲什麼和/或給出選擇? – enfield 2012-02-06 18:47:56

回答

4

如果你compairing $duration$this->END(其中來自右出的數據庫),你需要把你date('Y-m-d', $duration)覈對$this->END 你compairing一個的strtotime到date('Y-m-d')哪裏都是蘋果和桔子

更改 $ duration = strtotime(date('Ym-d',strtotime($ this-> Start))。'+30 days'); 到 $ duration = date('Y-m-d',strtotime($ this-> START。'+ 30 days'));

和你的腳本應該工作

希望這有助於

+0

這是用於驗證用戶輸入的表單。所以我試圖驗證用戶輸入,而不是數據庫內容。 – enfield 2012-02-06 18:46:31

+0

您的線路: $ duration = strtotime(date('Y-m-d',strtotime($ this-> Start))。'+30 days'); 返回一個unix時間戳 如果您將其轉換爲YYYY-MM-DD,則時間戳將始終更大 – AMayer 2012-02-06 18:52:06

+0

感謝您的輸入,我編輯了我的問題以顯示更改和結果。總是顯示錯誤。 – enfield 2012-02-06 19:20:26

2
#source: http://www.php.net/manual/en/datetime.diff.php 
$datetime1 = new DateTime('2009-10-11'); 
$datetime2 = new DateTime('2009-10-13'); 
$interval = $datetime1->diff($datetime2); 
echo $interval->format('%R%a days'); 
+0

感謝您的輸入,我編輯了我的問題以顯示更改和結果。不知道我是否正確使用它,但頁面不會呈現,並且日誌不顯示原因。 – enfield 2012-02-06 19:21:46

+0

'var_dump($ interval); $ days_diff = $ interval-> d; echo $ days_diff;' – cetver 2012-02-06 19:25:48

+0

也注意屬性'invert' – cetver 2012-02-06 19:31:09

0

您可能需要使用DateTime->diff和檢查天的差值小於30則觸發錯誤

0

我已經以如下方式使用它:

public function rules() 
{ 
    return array(
    ... 
     array('dateX','timeoutSomething'), 
    ... 
    ); 
} 


public function timeoutSomething($dateX){ 
    // If you try to modify the model after 300 seconds the error arise 
    if((strtotime($this->dateX)+300) < time()){ 
     $this->addError($dateX,"Timeout exceed"); 
    } 
} 
+0

不是我在這種情況下尋找的東西,但在許多其他情況下非常有幫助。我會好好利用它。 – enfield 2012-02-07 16:40:32