2009-08-27 18 views
4

我想解析一個特定格式的字符串,我真的很驚訝地發現我找不到一個好的函數來做到這一點。PHP:比strtotime更好的日期分析器

我發現的唯一一個是的strtotime,它不適合,因爲它猜測日期格式。我真的不相信「猜測」部分。 此外,我的字符串輸入法國格式(dd/mm/aaaa),似乎它不是很好理解(它解析美國格式,如mm/dd/aaaa)。

我在找的是一個函數,它接受輸入日期字符串和格式的解析。 我可以自己做一個正則表達式,但我不能相信它不存在。

我發現:

  • DateTime::createFromFormat()。但它只適用於PHP 5.3,我沒有能力升級PHP版本(5.2)
  • strptime()。這種方法做我想要的,但沒有在Windows平臺上實現(順便說一下:跆拳道??)

任何建議嗎?

+2

也許你可以使用http://www.phpclasses.org/browse/package/4535.html – 2009-08-27 11:25:19

+0

「我真的不相信」猜測「部分。」但是如果字符串被特別格式化了,那麼有什麼不能相信? – karim79 2009-08-27 11:29:18

+0

er - dd/mm/yyyy是英文格式。 mm/dd/yyyy是美國的格式 – Waggers 2009-08-27 11:30:18

回答

4

不幸的是,似乎這樣的解析更好地完成manually,通過在斜線處爆炸字符串然後切換日和月。

+0

是的,翻轉月份/日期並運行strtotime()並不難。 – 2009-08-27 11:54:51

+0

這只是爲了「不要重新發明輪子」。但是如果我解析它,strtotime是無用的,我寧願使用mktime()。 – 2009-08-27 11:59:14

+0

已接受。因爲雖然其他答案是正確的,但他們手動解析並使用strtotime(),而當字符串已被解析時,它看起來毫無用處。 最好的解決方案似乎使用正則表達式來解析字符串,然後使用mktime()來獲得unix時間。 – 2009-09-08 14:14:24

1

從的strtotime php.net以下注釋可以幫助:

失敗非美國日期在 順序是不確定的,如 01/02/2003 - 此爲解析2月1日, 而不是1月2日。

如果您解析日期非美國 區域,您可以翻轉的 這些元素你的約會:

<?php 
$y = $_POST['date']; 
if (preg_match('/^\s*(\d\d?)[^\w](\d\d?)[^\w](\d{1,4}\s*$)/', $y, $match)) { 
    $y = $match[2] . '/' . $match[1] . '/' . $match[3]; 
} 
echo date('d # m # Y', strtotime($y)); 
?> 

警告:以上僅適用於日期, 和減免次:12:30:01將 轉換爲30/12/01。

0

如果您知道日期格式輸入將採用英文格式,則可以將其處理爲更標準的日期格式。簡單的解析24/7/20072007-07-24是微不足道的。用正斜槓爆炸並將零件放在正確的位置。我知道strtotime會正確解析2007-07-24

1

我自己寫了一個類,我想你會在gadmdatecommand中找到一個好的版本。在http://sourceforge.net/projects/phpdbedittk

關於這裏的評論只是爆炸'/'和交換數字,它不是那麼簡單。如果你提供輸入日期,一個輸入框,你可能會得到 - 根據用戶所在地和應用

1/7/2010 2010年7月1日 2010年1月7日 7月15日 7月1日2010 1/6/8

和更多變化。我已經通過創建dateformats解決了這個問題,每個dateformats都有 a)匹配格式 的正則表達式b)一個數組映射器,它將正則表達式與日期片段(日期,月份,分鐘, AM/PM) c)對於日期的輸出格式()

HTH

0

strptime():
內部,這個函數調用由系統C庫提供的strptime()函數。此功能可以在不同的操作系統中顯示()明顯不同的行爲。在PHP 5.3.0及更高版本上推薦使用不受這些問題影響的date_parse_from_format()
http://www.php.net/manual/en/function.strptime.php