2010-01-05 87 views
2

PLATFORM: PHP & mySQL的PHP的MySQL - UNIX_TIMESTAMP不等於的strtotime

我存儲在以下列格式數據庫的日期+時間:日期( 「Y-M-d H:I:S」)。我的數據庫中有一個值的示例是:2010-01-05 07:36:33。在我的劇本,我已經設置了時區爲date_default_timezone_set("America/Chicago");

問題:

我在其他地方見過的UNIX_TIMESTAMP,我用的是我的查詢。 UNIX_TIMESTAMP對來自DB的日期值的值似乎與strotime(DB日期值)不同。

例:

考慮到在我的數據庫日期列的DB值之一是2010-01-05 7點36分33秒 現在,如果我以下列方式獲取此日期:

$result = mysql_query("SELECT date, UNIX_TIMESTAMP(date) AS ut_date FROM table"); 
$row = mysql_fetch_row($result); 

//The result of this is: 
$row['date'] = 2010-01-05 07:36:33 
$row['ut_date'] = 1262657193 
strtotime($row['date']) gives 1262698593 

對於我的我的應用程序中進一步計算,我需要的strtotime(日期)工作。我有很多比較這樣做。如果UNIX_TIMESTAMP(日期)與strtotime(日期)相同,我的問題就可以解決。其中一個樣本查詢,我需要的工作,就是:

$gap = 1; // time in minutes 
$tm2 = date ("Y-m-d H:i:s", mktime (date("H"),date("i")-$gap,date("s"),date("m"),date("d"),date("Y"))); 
$target = strtotime($tm2); 

$result2 = mysql_query("UPDATE table2 SET stat = 0 WHERE UNIX_TIMESTAMP(today_login_time) < $target "); 

以上是給我的不正確的結果。如果我試圖在上面的查詢中用strtotime代替UNIX_TIMESTAMP,它會給我一個錯誤,因爲strtotime函數似乎是PHP函數而不是相應的mySQL函數。 strtotime是否有相應的mySQL函數?我如何解決上述問題? 代碼高度讚賞解決上述問題。

預先感謝您。

回答

7

你的MySQL服務器和你的php實例的時區可能不同。 例如

echo date('Y-m-d H:i:s T', 1262657193);

我的機器2010-01-05 03:06:33 CET上打印(注意CET時區,這是UTC + 1),而你的MySQL服務器解釋同Unix時間戳爲2010-01-05 07:36:33

看到http://dev.mysql.com/doc/refman/5.1/en/time-zone-support.html
http://docs.php.net/datetime.configuration#ini.date.timezone

+0

我的確將時區設置爲date_default_timezone_set(「America/Chicago」)。那我現在怎麼解決這個問題?謝謝。 – Devner 2010-01-05 15:36:18

+0

例如通過爲MySQL服務器設置相同的時區,可以是全局的(例如在.ini文件中),也可以是基於每個會話('SET time_zone ='America/Chicago''應該可以工作)。您也可以通過使用MySQL的UTC_TIMESTAMP()或直接通過UNIX_TIMESTAMP()發送unix時間戳來恢復UTC時區,請參閱http://dev.mysql.com/doc/refman/5.1/en/date-and-time -functions.html – VolkerK 2010-01-05 17:35:19

+0

感謝您的信息。所以我只使用SET time_zone ='America/Chicago';在腳本的頂部做出這個工作?這足夠嗎?我不確定Web主機是否會給我.ini文件進行調整。所以如果這是我可以通過我的腳本編碼進行管理的東西,那將會很棒。請告訴我。謝謝。 – Devner 2010-01-05 19:55:16

1

您不需要將SQL時間戳轉換爲unix以查找某個位置。只是使用DATE_FORMAT它使事情變得更簡單:

WHERE DATE_FORMAT(`today_login_time`, "%Y-%m-%d") < '.date('Y-m-d', $my_tsp) 
+0

感謝您的評論。什麼是$ my_tsp?我如何在我的代碼中實現您的解決方案? – Devner 2010-01-05 15:49:11

+0

以及我不明白你的查詢在做什麼。但$ my_tsp可以是​​任何具有此格式YYYY-MM-DD的日期的字符串。 – antpaw 2010-01-05 16:16:00

+0

我試圖將stat更新爲0,以防DB中的日期時間超過1分鐘。所以我正在計算當前時間,從它減去1分鐘(讓我們調用這個$ target)並試圖檢查是否存在任何小於$ target的日期時間。那有意義嗎?我需要確保差異數據精確到最後一秒,那麼我將如何修改您的解決方案?請告訴我。謝謝。 – Devner 2010-01-05 17:15:31

1

由於差異恰好是11.5小時,似乎您遇到了時區問題。

+0

是的,date_default_timezone_set(「America/Chicago」)是我的腳本中的時區。我現在如何解決它?謝謝。 – Devner 2010-01-05 15:36:50

0

格式日期(「Y-m-d H:i:s」)沒有準確地描述日期和時間,因爲它不包含時區。由於沒有提供時區,Web服務器和數據庫都使用明顯不同的時區。

您應該考慮將日期存儲在數據庫中作爲unix時間戳。unix時間戳只是從Unix Epoch(1970年1月1日00:00:00 GMT)開始已經過去的秒數。這不受時區或夏令時的影響。這樣,轉換爲實際日曆日期和時間時,您只需要擔心時區和日光節約。

+0

感謝您的評論,拉里。只是想指出我有一個問題,爲什麼我使用日期時間來存儲我的日期和時間。下面是一個來自mysql參考的摘錄:「TIMESTAMP數據類型的範圍爲'1970-01-01 00:00:01'UTC至'2038-01-19 03:14:07'UTC」。我們已經在2010年,即距離該範圍的最大值僅28年,之後,如果使用時間戳,我預計不可預測的值。所以我想避免它,並使用日期時間來解決它。現在有什麼辦法可以解決嗎? (我在腳本中使用了default_timezone_set(「America/Chicago」)) – Devner 2010-01-05 15:46:35