2010-02-25 215 views
2

以下是我有:PHP日期格式轉換

$dateFormat = 'M d, Y'; 
$dateString = 'January 23, 2010'; 

我需要的是$dateString時間戳,所以我可以這樣做:

$newFormattedDate = date('Y-m-d', $timestamp); 

我試圖用strtotime功能,但它會嘗試找出格式本身,並不總是工作。在我的情況我知道,這兩個日期字符串和日期格式。

如何將$timestamp設置爲適用於date函數的適當值?

編輯:我想這能在Linux和Windows環境下工作。

編輯:解決方案必須支持PHP版本4或更高

編輯:MySQL有一個叫STR_TO_DATE函數,它接受一個日期字符串和日期格式和返回Y-m-d格式的日期字符串。任何用於php的等效函數也適用於我。

回答

3

使用strptimemktimestrftime

$ftime = strptime($dateString, $dateFormat); 
$timestamp = mktime($ftime['tm_hour'], $ftime['tm_min'], $ftime['tm_sec'], 1, 
        $ftime['tm_yday'] + 1, $ftime['tm_year'] + 1900); 

echo strftime('Y-m-d', $timestamp); 

請注意,strptime未在Windows平臺下實現。

注意,參數mktime是有點不尋常 - strptime返回一年中的一天(0-365之間,包括端點)而不是月和月中的某一天,所以我們設置月份參數mktime 1 ,並在今年的某天添加1。此外,strptime回報年以來1900年度值返回,所以我們需要通過它通過對mktime之前加上1900年。

此外,您可能需要檢查$ftime是否爲FALSE,然後再將其傳遞到mktimestrptime返回FALSE表示該輸入$dateString是不是有效的日期格式根據$dateFormat

+0

感謝多米尼克但在strptime的PHP manaul它說:「這個功能是不是在Windows平臺上實現。」這對我來說是一個殺手。 – matte 2010-02-25 09:09:23

+0

還有'strtotime'幫助。 – casraf 2010-02-25 09:10:02

+0

嗨Henasraf,正如我在我的問題中解釋的,strtotime在這種情況下不起作用。 – matte 2010-02-25 09:11:05

7

由於PHP5.3中可以使用的DateTime API

$dt = date_create_from_format('M d, Y', 'January 23, 2010'); 
echo date_timestamp_get($dt); 

或OOP符號

$dt = DateTime::createFromFormat('M d, Y', 'January 23, 2010'); 
echo $dt->getTimestamp(); 

注意的是,雖然DateTime可在PHP 5.3 <,上面所用的方法是不雖然你可以模擬->getTimestamp()->format('U'),對於createFromFormat()

沒有簡單的解決方法210

另一種方法是使用Zend_Date從Zend框架:

$date = new Zend_Date('Feb 31, 2007', 'MM.dd.yyyy'); 
echo $date->get(Zend_Date::TIMESTAMP); 
+0

嗨戈登,謝謝你的答案,但我需要這個工作在PHP 4或更高。我也添加了這個要求來質疑。 – matte 2010-02-25 09:33:13

2

鑑於我的問題的理解,什麼是在PHP可用,你需要在一些地方或其他放鬆您的期望。

'簡單'的解決方案(已經打折)將強制使用PHP 5.3及其中的工具。

一個不那麼簡單的解決方案是將這些添加並將它們移植到PHP-land(與PHP 4兼容,祝你好運)。

另一種探索途徑是考慮strtotime不適用於您並且解決這些限制的場合。

你的格式字符串有多大的變體?提供一個解決方案映射格式字符串到函數/方法(做日期解析),提供它們是非常有限的。

0
$dateFormat = 'M d, Y' 
$timestamp = strtotime($dateString); 
echo date($dateFormat, $timestamp); 

如果我沒有誤解你的問題,你可以試試上面的代碼..