2010-11-19 86 views
10

我正在使用PHP中的數組值。其中一些值可能包含各種字符串格式的日期。如何確定值是否是PHP中的日期

我需要將多種格式的日期轉換爲它們的數值(Unix時間戳)。問題是能夠確定字符串是否是日期。

使用

if (($timestamp = strtotime($str)) === false) 

將檢查一個字符串的有效日期,但我怎麼確定是否值應該甚至作爲有效的日期?

實施例:

$x = {1,2,3,"4","11/12/2009","22/12/2000",true,false}; 

foreach($x as $value) 
{ 

if(is_bool($value)) 

if(is_string($value)) 

if(is_numeric($value)) 

if(is_date($value)) ? 

... 

} 

總之,有一種簡單的方法來檢查一個字符串值是一個日期?

+1

這是什麼東西:'$ x = {/ * ... * /};'? – jwueller 2010-11-19 14:52:06

+0

這是我的sudo代碼數組:-) – 2010-11-19 14:58:43

回答

20

總之,有沒有簡單的方法來檢查字符串值是否是日期?

不是真的,因爲它可以是任意格式。

如果可能的話,我會傾向於將解析的結果記錄爲strtotime()。如果它設法創建一個有效的日期,那就好了。如果沒有,您將收到false

但是,由於strtotime()甚至解析了「上週五」之類的事情,因此有可能出現誤報。

如果strtotime()對您來說太自由了,您可以考慮構建您想接受的日期格式集合,並在每個日期使用每種格式運行PHP 5.3的DateTime:createFromFormat

喜歡的東西(未經測試)

$formats = array("d.m.Y", "d/m/Y", "Ymd"); // and so on..... 
$dates = array(1,2,3,"4","11/12/2009","22/12/2000",true,false); 

foreach ($dates as $input) 
{ 
    foreach ($formats as $format) 
    { 
     echo "Applying format $format on date $input...<br>"; 

     $date = DateTime::createFromFormat($format, $input); 
     if ($date == false) 
     echo "Failed<br>"; 
     else 
     echo "Success<br>"; 
    } 
} 
+0

我不認爲有一個快速的方法來做到這一點。但是,您的解決方案很好。謝謝。 – 2010-11-19 15:55:22

+3

看來,它可以做到快速和優雅:http://au1.php.net/checkdate#113205 – CMCDragonkai 2013-12-08 15:28:20

13

與佩卡的腳本的問題是,日期「2011-30-30」也被認爲是有效的。這是修改後的版本。

$formats = array("d.m.Y", "d/m/Y", "Ymd"); // and so on..... 
$dates = array(1,2,3,"4","11/12/2009","22/12/2000",true,false); 

foreach ($dates as $input) 
{ 
    foreach ($formats as $format) 
    { 
     echo "Applying format $format on date $input...<br>"; 

     $date = DateTime::createFromFormat($format, $input); 
     if ($date == false || !(date_format($date,$format) == $input)) 
     echo "Failed<br>"; 
     else 
     echo "Success<br>"; 
    } 
} 
1

http://au1.php.net/checkdate#113205推斷; 只需將$ formats數組更改爲您要檢查的所有格式即可。

public function convertDate($value) { 

    $formats = ['M d, Y', 'Y-m-d']; 
    foreach($formats as $f) { 
     $d = DateTime::createFromFormat($f, $value); 
     $is_date = $d && $d->format($f) === $value; 

     if (true == $is_date) break; 
    } 

    return $is_date; 

} 
相關問題