2010-02-18 80 views
0

我有一個關於使用php計算日期的常見問題。使用php計算日期

如果我保存這樣的時間戳在我的數據庫會發生什麼:

$db_timestamp = '2010-01-31 00:00:00'; 

,然後運行日常的腳本,如果一個月過去了,因爲時間戳保存在數據庫中檢查:

if ($db_timestamp == make_unix_timestamp(mktime(0, 0, 0, date("m") - 1, date("d"), date("Y")), TRUE, 'eu'))) 
{ 
    do something 
}; 

我的問題是,我只是意識到這不適用於所有日期。在這種情況下,'做點事'不會在二月份召開,因爲二月份沒有第三十一天。關於如何實現類似的東西的任何想法?

回答

3

首先,你的DBMS應該有一個數據鍵入日期/時間。它們都以類似的方式存儲時間戳。

如果您需要返回PHP可以理解的時間戳,MySQL會提供一個名爲UNIX_TIMESTAMP()的函數。

SELECT UNIX_TIMESTAMP(`createTime`) FROM `articles`; 

相反函數被調用FROM_UNIXTIME()

INSERT INTO `articles` (`createTime`) VALUES (FROM_UNIXTIME(12345678)); 

MySQL的(或其他DBMS對於這個問題,但我使用MySQL作爲示例)具有的其它功能的轉換,以計算時間差。例如,要知道,如果一篇文章是一個多月的時候,使用可以使用DATE_SUB()

SELECT * FROM `articles` 
    WHERE `article`.`createTime` <= DATE_SUB(NOW(), INTERVAL 1 MONTH); 

(在的MySQL5以上,你也可以把它寫成這樣)

SELECT * FROM `articles` 
    WHERE `article`.`createTime` <= (NOW() - INTERVAL 1 MONTH); 
+0

謝謝!這真是太棒了,這裏唯一的問題是mysql爲'2010-01-31'輸出'2010-02-28'+ 1 MONTH,而php mktime輸出'2010-03-03' m')+ 1 :( – Frank 2010-02-18 20:02:03

+0

@Frank:MySQL的計算在這裏是有效的,如果你想計算30天,使用'INTERVAL 30 DAY'。 – 2010-02-18 22:23:32

1
$ts = strtotime($db_timestamp); 
if ($ts < (time() - 2592000)) 
{ 
    do something; 
} 

2592000秒=30天

0

你如何考慮「比較它種取決於一個月「。

如果「一個月」的意思是「提前30天」,一個解決方案是比較從數據庫中獲得與當前時間戳時間戳:

$db_timestamp = strtotime('2010-01-31'); 
$current_timestamp = time(); 
var_dump(($current_timestamp - $db_timestamp)/(24*3600)); 

如果差值爲30天......這是它。


有兩點要注意:

  • strtotime將日期轉換爲一個UNIX timestamp--即因爲1970-01-01
  • time的秒數返回當前UNIX時間戳
  • 您可以比較時間戳:它們僅表示秒數;並有24 * 60 * 60,每天秒;-)
+0

一個月是同一天,僅僅一個月後。我唯一的問題是,如果用戶在1-31上激活一個帳戶,那麼沒有2-31 - 但是,在2月的最後一天不是1-31之後的30天......棘手的: ( – Frank 2010-02-18 18:31:44

1

你可以通過查詢檢查時間戳:

的MySQL:

select date from table where date < now() - INTERVAL 1 MONTH;