2013-03-18 84 views
2

我正在驗證庫的日期驗證。日期格式和包含日期的變量將被提供給庫。在不知道格式的情況下驗證日期

$validator->validate($_POST['date'], 'm/d/y'); 

這是很容易做到基本的驗證與DateTime::createFromFormat()

if (DateTime::createFromFormat($format, $date) !== false) { 
    // "valid" date 
} 

我的問題是,用這種方法無效的日期,如23/23/23通,因爲DateTime類將轉移的日期和設置它到2024-11-23。我知道checkdate()的存在,但不知道格式我看不到一種方法來提取起源月/日/年。

關於如何驗證這樣的日期的任何想法?

+0

任何機會,以跌停的可能日期字符串變量? – 2013-03-18 07:13:19

+0

@ axel.michel - 我寧可不 – Galen 2013-03-18 07:23:20

+1

如果你不知道格式,那麼你會得到歧義。是1/2/13 2月1日(歐洲格式)還是1月2日(美國格式)?你可以毫不含糊地解決一些問題,比如23/9/13,但是每個月的前12天都是不明確的。這不包括以2位數年份開始的日期:13/1/2 = 2013年1月2日。 – rossum 2013-03-18 13:42:10

回答

3

既然你不知道日期的格式,那麼你應該使用date_parse

date_parse - 返回有關給定日期

print_r(date_parse("23/23/23 00:14:38")); 
詳細信息關聯數組

輸出

Array 
(
    [year] => 2023 
    [month] => 3   <------------------- Attempts to correct month 
    [day] => 23 
    [hour] => 0 
    [minute] => 14 
    [second] => 38 
    [fraction] => 0 
    [warning_count] => 0 
    [warnings] => Array 
     (
     ) 

    [error_count] => 1 
    [errors] => Array 
     (
      [0] => Unexpected character  <----- add errors found 
     ) 

    [is_localtime] => 
) 

簡單的類

$date = "23/3/2013 00:14:38"; 
if (DateTimeParse::createFromString($date) !== false) { 
    // "valid" date 
} 

類用於

class DateTimeParse { 

    public static function createFromString($string) { 
     $date = date_parse(str_replace("/", "-", $string)); 
     if ($date['error_count'] > 0) 
      return false; 
     $date = sprintf("%d-%d-%d %d:%d:%d", $date['year'], $date['month'], $date['day'], $date['hour'], $date['minute'], $date['second']); 
     return \DateTime::createFromFormat("Y-m-d g:i:s", $date); 
    } 
} 
+0

我認爲他的問題不完全是大約23/23/23 ... 10/10/10如何不知道它的格式 – Amir 2013-03-18 08:00:42

+0

http://eval.in/12984 – Baba 2013-03-18 08:02:05

+1

好像檢查從date_parse返回的警告或錯誤沒有竅門。 – Galen 2013-03-18 08:13:53