2008-09-26 68 views
13

有沒有一種方法來檢查,看是否有日期/時間,你會覺得這些很容易檢查有效:PHP檢查有效日期,奇怪的日期轉換

我什麼是真正得到這樣的:

echo date('Y-m-d', strtotime($date)); 

結果: 「1999-11-30」,

吧?我從0000-00-00到1999-11-30?

我知道我可以做比較,看看日期是否是這些值中的任何一個等於我的日期,但它不是一個非常健壯的方式來檢查。有沒有好的方法來檢查我是否有有效日期?任何人都有很好的功能來檢查這個?

編輯: 人都在問什麼,我跑: 運行PHP 5.2.5(CLI)(建:2008年7月23日十一點32分27秒),在Linux上本地主機2.6.18-53.1.14.el5# 1 SMP Wed Mar 5 11:36:49 EST 2008 i686 i686 i386 GNU/Linux

+0

這是什麼版本的PHP? – Swati 2008-09-26 19:09:31

+0

試試這個:http://php.net/manual/en/function.checkdate.php – 2012-02-19 19:24:53

+0

strtotime(「0000-00-00 00:00:00」)在32位系統上返回FALSE。 \t strtotime(「0000-00-00 00:00:00」)在64位系統上返回-62169955200。 – 2012-11-21 09:58:04

回答

22

php.net

<?php 
function isValidDateTime($dateTime) 
{ 
    if (preg_match("/^(\d{4})-(\d{2})-(\d{2}) ([01][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$/", $dateTime, $matches)) { 
     if (checkdate($matches[2], $matches[3], $matches[1])) { 
      return true; 
     } 
    } 

    return false; 
} 
?> 
2

echo date('Ym-d',strtotime($ date));

結果在:「1999-11-30」

strtotime結果是943920000 - 這是秒,大致數量,Unix epoch(鹼從其中時間被測量)到1999-之間11-30。

有一個記錄mysql bugmktime(), localtime(), strtotime()所有返回這個奇怪的值,當您嘗試一個劃時代前時間(包括「0000-00-00 00:00:00」)。有鏈接的線程上的一些爭論,這是否實際上是一個錯誤:

由於時間戳從1970年開始,我不認爲它應該 工作反正。

下面是一個函數,我用它來將dateTimes轉換成比較等的時間戳,對於超過「0000-00-00 00:00: 00"

/** 
* Converts strings of the format "YYYY-MM-DD HH:MM:SS" into php dates 
*/ 
function convert_date_string($date_string) 
{ 
    list($date, $time) = explode(" ", $date_string); 
    list($hours, $minutes, $seconds) = explode(":", $time); 
    list($year, $month, $day) = explode("-", $date); 
    return mktime($hours, $minutes, $seconds, $month, $day, $year); 
} 
+0

我試過日期('Ym-d',convert_date_string('0000-00-00 00:00:00')),但仍然給出了1999年的日期 – SeanDowney 2008-09-26 19:19:37

+0

發現PHP bug報告對PHP中基於時間函數的奇怪行爲爲0000-00 ..值。關於這個線程有一些爭論,是否它實際上是一個錯誤,就好像人們會想在1970年之前計算一個日期一樣! – ConroyP 2008-09-26 19:24:35

1

當你出門在外的範圍內不要期望一致的結果:

CF strtotime

CF Gnu Calendar-date-items的.html

「對於數字月份,在ISO 8601 格式 '年 - 月 - 日' 是允許的, 其中year是任意正數, 一個月是01 和12之間的數字,以及天是 的數字,介於01和31之間。一個 前導零必須存在,如果 數量小於十。 「

所以, '0000-00-00' 給出奇怪的結果,這是合乎邏輯的!


」 此外, 並非所有的 平臺都支持負時間戳,因此您的日期範圍可能爲 ,因此不得早於Unix 時期。這意味着例如 %E,%T,%R和%d(有可能是 更多)和日期前一月 1,1970年將不會在Windows,一些 Linux發行版,和其他幾個 操作系統。」

CF strftime


使用checkdate函數,而不是(更強大的):

月份: 月份介於1和12之間,包括

日期: 當天在給定的 月份的允許天數之內。考慮到閏年爲 。

year: year is between 1 and 32767 including

1

如果你只是想處理日期轉換沒有時間的MySQL日期字段,你可以像我一樣修改這個偉大的代碼。 在我沒有執行此功能的PHP版本中,我每次都得到「0000-00-00」。煩人。

function ConvertDateString ($DateString) 
{ 
    list($year, $month, $day) = explode("-", $DateString); 
    return date ("Y-m-d, mktime (0, 0, 0, $month, $day, $year)); 
} 
1

該版本允許字段是空的,以MM/DD/YY或毫米/ dd/yyyy格式具有日期,允許單個數字小時,添加任選的上午/下午,並糾正一些細微的缺陷在時間匹配。

仍然允許一些病態的時間,如'23:14 AM'。

function isValidDateTime($dateTime) { 
    if (trim($dateTime) == '') { 
     return true; 
    } 
    if (preg_match('/^(\d{1,2})\/(\d{1,2})\/(\d{2,4})(\s+(([01]?[0-9])|(2[0-3]))(:[0-5][0-9]){0,2}(\s+(am|pm))?)?$/i', $dateTime, $matches)) { 
     list($all,$mm,$dd,$year) = $matches; 
     if ($year <= 99) { 
      $year += 2000; 
     } 
     return checkdate($mm, $dd, $year); 
    } 
    return false; 
} 
-1
<?php 

function is_date($str) { 
    $stamp = strtotime($str); 

    if (!is_numeric($stamp)) { 
     return FALSE; 
    } 
    $month = date('m', $stamp); 
    $day = date('d', $stamp); 
    $year = date('Y', $stamp); 

    if (checkdate($month, $day, $year)) { 
     return TRUE; 
    } 
    return FALSE; 
} 
?> 
0

我一直只是改變了馬丁回答以上,這將驗證任何類型的日期和你喜歡的格式返回。

只需通過編輯腳本下方的行來更改格式 strftime(「10-10-2012」,strtotime($ dt));

<?php 
echo is_date("13/04/10"); 

function is_date($str) { 
    $flag = strpos($str, '/'); 

    if(intval($flag)<=0){ 
     $stamp = strtotime($str); 
    } else { 
     list($d, $m, $y) = explode('/', $str);  
     $stamp = strtotime("$d-$m-$y"); 
    } 
    //var_dump($stamp) ; 

    if (!is_numeric($stamp)) { 
     //echo "ho" ; 
     return "not a date" ;   
    } 

    $month = date('n', $stamp); // use n to get date in correct format 
    $day = date('d', $stamp); 
    $year = date('Y', $stamp); 

    if (checkdate($month, $day, $year)) { 
     $dt = "$year-$month-$day" ; 
     return strftime("%d-%b-%Y", strtotime($dt)); 
     //return TRUE; 
    } else { 
     return "not a date" ; 
    } 
} 
?> 
0
<?php 
function is_valid_date($user_date=false, $valid_date = "1900-01-01") { 
    $user_date = date("Y-m-d H:i:s",strtotime($user_date)); 
    return strtotime($user_date) >= strtotime($valid_date) ? true : false; 
} 

echo is_valid_date("00-00-00") ? 1 : 0; // return 0 

echo is_valid_date("3/5/2011") ? 1 : 0; // return 1 
5

如這裏提到的:https://bugs.php.net/bug.php?id=45647

這裏沒有錯誤,00-00-00指2000-00-00,這是1999-12-00, 這是1999-11-30。沒有錯誤,完全正常。

,如圖所示的幾個測試,向後滾動是預期的行爲,如果有點不安:

>> date('Y-m-d', strtotime('2012-03-00')) 
string: '2012-02-29' 
>> date('Y-m-d', strtotime('2012-02-00')) 
string: '2012-01-31' 
>> date('Y-m-d', strtotime('2012-01-00')) 
string: '2011-12-31' 
>> date('Y-m-d', strtotime('2012-00-00')) 
string: '2011-11-30' 
0

我用下面的代碼來驗證日期從ExtJS的應用程序來。

function check_sql_date_format($date) { 
    $date = substr($date, 0, 10); 
    list($year, $month, $day) = explode('-', $date); 
    if (!is_numeric($year) || !is_numeric($month) || !is_numeric($day)) { 
     return false; 
    } 
    return checkdate($month, $day, $year); 
}