看了官網對 zen_date_raw() 的討論,覺得太過頭了,太活了,反而令人不知所措,網頁旁邊給一個例子,就會讓使用者覺得清楚簡單。所以提供一個簡單一點的建議。
對於檢測使用者輸入的日期:
1. 連在一起的數字,只能當一個數目,也就是,不從連在一起的數字,分離出年,月或日。
2. 日期數字間可以有不同的 分界 如:'12.01.1980','12/01/80', '12 1 1980', '12abd1/1980'
3. 覺得沒有必要接受英文縮寫月名,但為通用起見,加入為 option。如:'jan10/1980' '10jan75'
對於日期格式的定義:
沿用 zencart 的方法,因為其他地方也用 DATE_FORMAT, 但我們也接受 如:'d/m-y', 'dd/mm/yyyy', 'yyyy/mm/dd', 'yy.dd.mmm'。
還有,日期欄的最小長度,改為 6 ,才能適合以上所談的方法。
不知是否可用? 至少輸入時活一點。
修改 chinese_tc_utf-8.php 裏的 zen_date_raw()
function zen_date_raw($date, $reverse = false) {
$cnt = preg_match_all ( "/y+|d+|m+/",strtolower(DATE_FORMAT),$regs);
if ($cnt == 3) $dformat = $regs[0]; else return false;
//---Decommenting these lines to accept name of the months in English ------------
//$search = array ('/jan/', '/feb/', '/mar/', '/apr/', '/may/', '/jun/', '/jul/', '/aug/', '/sep/', '/oct/', '/nov/', '/dec/');
//$replace = array ('.01.','.02.','.03.','.04.','.05.','.06.','.07.','.08.','.09.','.10.','.11.','.12.');
//$date = preg_replace($search, $replace, strtolower($date));
//-----------------------------------------------------------------
$cnt = preg_match_all ( "/\d+/",$date,$regs);
if ($cnt == 3) $dvalue = $regs[0]; else return false;
$yc = $mc = $dc = 0;
for ($i = 0; $i < 3; $i++) {
switch(substr($dformat[$i],0,1)) {
case ("y"):
if ($yc == 0) $yc = 1; else return false;
$y = $dvalue[$i];
if (strlen($y) < 2) { $y = '0' . $y; }
if (strlen($y)=="2") {
if ($y <= date("y"))
$y = "20" . $y;
else
$y= "19" . $y;
}
break;
case ("d"):
if ($dc == 0) $dc = 1; else return false;
$d = $dvalue[$i];
if (strlen($d) < 2) { $d = '0' . $d; }
break;
case ("m"):
if ($mc == 0) $mc = 1; else return false;
$m = $dvalue[$i];
if (strlen($m) < 2) { $m = '0' . $m; }
break;
}
}
if ($reverse) { $date= $d . $m . $y; } else { $date= $y . $m . $d; }
return $date;
}