2012-06-27 60 views
1

我正在做一個日期搜索過濾器,我的日期顯示爲「j.n.Y G:i(26.6.2012 15:22)」。 用戶可以輸入整個日期或只輸入整個日期的一部分:「26.6」,「6.2012」,「6」,「15:22」均爲有效輸入。因爲我需要在數據庫中檢查此日期,所以需要將格式更改爲數據庫中的一個。對於我使用:輸入字符串的格式datetime

$datum = '25.6.2012'; 
$date = DateTime::createFromFormat('j.n.Y',$datum); 
echo $date->format('Y-m-d H:i'); 

如果我得到一個錯誤,如果$數據是不是在格式j.n.Y(如果我只輸入j.n或上述絃線部分之一,我得到一個錯誤)。

問題在於,對於輸入的字符串'j.n.Y',我得到日期的正確輸出,該日期還將當前時間添加到日期字符串中(不在初始日期字符串中)。例如:我輸入「22.6.2012」,然後輸出「2012-06-22 15:33」。

這兩個問題可以修復現有的PHP函數還是應該自己做?

幫助將不勝感激。

+0

'strtotime'或'strftotime'可能會稍微緩解一些任務。 – hjpotter92

回答

1

你可以列出你可接受的數據格式在數組中,並循環周圍DateTime::createFromFormat()查看是否有任何的輸入產生適當的日期:

$formats = array('j.n', 'j.n.Y'); 
$datum = '25.6.2012'; $date = false; 

foreach($formats as $format) { 
    $date = DateTime::createFromFormat($format, $datum); 
    if(!($date === false)) break; 
} 

if($date === false) { 
    echo "Invalid date!\n"; 
} 

最後,如果你想擺脫當前時間在新創建的對象和時間設置爲00:00:00,只需使用setTime()方法日期對象:

// Sets the time to O hours, 0 minutes, 0 seconds 
$date->setTime(0, 0, 0); 
+0

謝謝你的幫助! – ifsession

0

對於第一個問題,你需要寫一些自己的代碼,因爲一些Y的我們可接受的輸入不在公認的輸入格式中。規範輸入值將需要您完全解析它(正則表達式是一種很好的開始方式),然後您可以毫無困難地致電DateTime::createFromFormat

對於第二個問題,在格式字符串的開頭加上感嘆號!可以解決時間問題。從documentation

如果格式包含字符!,則在格式不設置,以及值提供給左側的 的產生 時間部分,將被設定爲對應的值從Unix時代開始。

Unix時代是1970-01-01 00:00:00 UTC。

但是,由於您將需要如上所述完全解析輸入,所以此問題沒有實際意義。另請注意,驚歎號會導致年,月和日的缺失值使用可能不需要的默認值。

+0

謝謝你的回答,它也幫助我! – ifsession