2014-02-14 33 views
1

我正在努力做一些日期驗證。我創建了3個不同的功能,它們都可以工作,但不是特殊情況。檢查日期問題

我做的最後一件事是這樣的:

public function valid_date($date, $format = 'd/m/Y'){ 
    $d = DateTime::createFromFormat($format, $date); 
    return $d && $d->format($format) == $date; 
} 

我從PHP網站這個功能,就像我想它的工作比我的我代替它更好。

日期格式,用戶必須輸入爲DD/MM/YYYY和在數據庫中的格式是YYYY-MM-DD 00:00:00

當我進入此無效日期:30/30/1996該功能將其識別爲有效日期。然後我有這個其他函數來爆炸「/」,並使它像數據庫格式的「 - 」,並在該功能,它給了我的錯誤:

DateTime :: __構造():未能解析時間字符串(1996-30-30)處於第6(0):意外字符」

public function explodingDates($date){  
    list($day,$month,$year) = explode('/', $date); 
    $newDate = $year.'-'.$month.'-'.$day; 
    return (new \Datetime($newDate)); 
} 

我在這裏燒我的大腦,不知道還能爲驗證做。它還必須準備好接受任何形式的輸入(如「askhdakjdh」,「123213」,「1.25/269」)並返回無效日期。

在此先感謝

+0

@佛瑞德-II-簡而言之:* shouln't *。你是否建議分配一個表達式? – BlitZ

+0

有一個'\'的回報是一個錯字? – Wilmer

+0

@ Fred-ii-爲什麼公衆會導致錯誤? – Limon

回答

1

不要爆炸日期字符串。使用DateTime::createFromFormat()創建DateTime對象,並使用format()方法將其轉換成不同的格式:

function ConvertToMySQLDate($datestr) { 
    $d = DateTime::createFromFormat('d/m/Y', $datestr); 
    $valid = $d && $d->format('d/m/Y') == $datestr; 
    if ($valid) { 
     return $d->format('Y-m-d'); 
    } 
    return FALSE; 
} 

上述函數接受一個日期字符串格式爲dddd-mm-yyyy,檢查它是否是有效的,並返回日期採用MySQL格式(yyyy-mm-dd)。如果提供的日期無效,它將返回false。

實例:

var_dump(ConvertToMySQLDate('30/30/1996')); // bool(false) 
var_dump(ConvertToMySQLDate('13/12/1996')); // string(10) "1996-12-13" 

Demo

+0

未來日期怎麼樣?我已經嘗試了這一點,並與我所提到的所有工作。但日期:2014年3月28日給我一個錯誤 – Limon

+1

@Limon:它給你什麼錯誤?它[對我很好](https://eval.in/101712)。 –

+0

@amal,請解釋這一行是什麼意思。我無法得到結構。 $ d && $ d-> format('d/m/Y')== $ datestr。這將被視爲如果循環? – Pravin