2016-01-07 50 views
0

目前,我試圖解析出消息收到時間戳的日期。我有月份和日期,但沒有指定年份。事件總是發生在最近的(人類)閱讀時間。它在大多數情況下很好地執行此操作:PHP - 解析字符串作爲過去的日期

$time = strtotime("Jan 2 8:38pm"); 

返回今年的日期,這是正確的。不幸的是,我得到的問題,當我嘗試,例如做:

$time = strtotime("Dec 31 8:38pm"); 

返回這還沒有發生的日期,並不會發生在今年所有的剩餘。很明顯,我的信息未來不會發送。我需要它返回去年12月31日。

平日,我有一個解決方案通過像這樣的工作日之前前面加上「最後」:

$time = strtotime("Last Saturday 8:38pm"); 

總是返回的最後一個星期六的時間。然而,在這裏嘗試做同樣的事情是行不通的:

$time = strtotime("Last Dec 31 8:38pm"); 

這將返回false。我知道1年遞減一個日期,我可以這樣做:

$time = strtotime("Dec 31 8:38pm -1 year"); 

這偉大工程,爲31月。然而,1月2日,現在將失敗:

$time = strtotime("Jan 2 8:38pm -1 year"); 

一個解決方案我想到的如果過去的日期過去了,那麼將從所得值中減去一年(86400 * 365)。但是,如果我們超過了閏年的二月份,這個結果將會失敗。在這種情況下,我們最終會有一天的時間。

我想出了迄今爲止最好的解決辦法是這樣的:

$time = strtotime($raw_time); 
if ($time > time()) { 
    $time = strtotime($raw_time." -1 year"); 
} 

這似乎有點浪費,使兩個調用的strtotime我知道可能不是一個非常有效的功能。這是最優雅的解決方案嗎?

是否有人知道strtotime中的一個選項,它強制日期在過去而不是在將來?

有沒有另一種方法來解析這些日期,我應該考慮?

效率對此很重要,因爲我將用它解析很多日期,但我還想要簡單易讀的代碼,以便以後能夠理解它。

+0

http://php.net/manual/en/function.strtotime.php chk例子 – devpro

+0

你不需要解析相同的字符串兩次。 'strtotime(' - 1 year',$ time)'也會這樣做。 –

+0

我已經看了很多頁面。那是我看的第一個地方。我有點期待會有一個簡單的選擇。也許我忽略了它。我在頁面上搜索了「last」和「previous」,但仍然找不到任何東西。我也搜索過'strtotime date in past'這樣的東西,並沒有這樣的運氣。 – azoundria

回答

1

你的方法很好,因爲沒有日期格式來得到你想要的。另一種方法可以使用DateTime類:

$datetime = new DateTime($raw_time); 
if ($datetime > new DateTime()) { 
    $datetime->modify('-1 year'); 
} 

您可以測試它的兩種方法之一是速度更快。我的猜測是,這是一個微不足道的優化。