2012-07-25 42 views
3

我有一個PHP MySQL查詢,它將一些數據插入到MySQL數據庫中,並且它包含一個時間戳。php timestamp utc

目前INSERT查詢使用NOW()的時間戳列,它是在下面的格式保存在數據庫中:2012-07-24 13:13:02

不幸的是,我的服務器是不是在我的時區,被列爲美國/ Los_Angeles如圖print date_default_timezone_get();

我希望能做到以下幾點:

date_default_timezone_set('Europe/London'); 
$timefordbLondonEU = date('Y-m-d H:i:s', time()); 

,只是保存到數據庫中$timefordbLondonEU代替NOW();

這是保存這些數據的好方法嗎?

非常感謝,

理查德

[添加的文本]

我改變了類型的MySQL數據庫,以DateTime,也做了以下內容:

date_default_timezone_set('Europe/London'); 
$timefordbLondonEU = date('Y-m-d H:i:s', time()); 

這是工作,但我仍然沒有得到整體概念。

Assumptions based on your comments: 
  1. 的MySQL =不具有您只需使用INT型數據類型UTC。
  2. Unix_TimeStamp()會保存當前時間還是計數?採用UTC格式,例如1343247227.
  3. 由於UTC是通用0點的計數,因此您可以從中獲取任何時區。假設你不想在1970年的參考0點之前建立一個日期。

我的猜測和從你所說的最好的方法是在INT中保存UTC的時間1343247227),然後從那裏生成你想要的任何時區。再假設你不需要在1970年的參考0點之前存儲日期。

同樣爲什麼不作爲日期時間存儲YYYY-MM-DD HH:MM:SS在已知時區,然後轉換爲UTC或其他時區。這一切似乎相當混亂=(

+3

將所有時間存儲爲UTC,然後將它們轉換爲您在出路時所需的內容。 – Petah 2012-07-25 22:41:27

+0

或者,如果您不需要在1970年之前存儲日期,則可以將它們存儲爲Unix時間戳,方法是將該字段設置爲「INT」。 – 2012-07-25 22:45:36

回答

7

由於@Petah在評論中說,存儲您的次UTC,並根據需要在應用程序中隱蔽它們。

Unix的時間戳是UTC所以我通常存儲我的時間在數據庫作爲時間戳,這節省了首次轉換爲UTC以插入時的頭痛和混淆,然後從選擇時的UTC開始。

也就是說,使您的時間字段爲INT類型,並且在插入MySQL時使用函數UNIX_TIMESTAMP() ,或者使用time()函數從PHP獲取時間戳。

當您獲取從DB這將是UTC的時間戳,但是當你在使用date() PHP應用程序顯示,它會在服務器時區顯示,或任何你date_default_timezone_set設置。

因此下面兩個查詢將工作:

INSERT INTO `table` (id, time) VALUES(NULL, UNIX_TIMESTAMP()); 

// or 

$time = time(); 

$query = "INSERT INTO `table` (id, time) VALUES(NULL, $time); 

如果你想從數據庫中選擇它作爲一個DATETIME,你可以這樣做:

SELECT *, FROM_UNIXTIME(time) as dt FROM `table` WHERE 1 

產生的dt欄會格式爲yyyy-MM-dd hh:mm:ss

如果你有PHP的版本是64位的,你是不是僅限於1970年,您可以使用格式化date()

PHP中的數字時間戳 - 2036範圍內,PHP將支持64位的時間戳,只是在這種情況下,請確保在MySQL中使用BIGINT列。

希望有所幫助。

+0

好吧,這可能會讓我更加困惑......但是我將MySQL中的類型更改爲DateTime,並執行了以下操作:date_default_timezone_set('Europe/London'); $ timefordbLondonEU = date('Y-m-d H:i:s',time()); 它的工作,但我仍然沒有得到這個真的。 假設: MySQL =沒有UTC的數據類型,因此您使用INT類型。 Unix_TimeStamp()會保存當前時間還是計數?採用UTC格式,例如1343247227. 由於UTC是一個通用的0點數,你可以從它得到任何時區? – DevilCode 2012-07-26 00:02:19

+0

MySQL'DATETIME'列只是'YYYY-MM-DD HH:MM:SS'格式的一列,時區是不相關的。它可能是UTC或任何其他時區。 Unix時間戳(在MySQL中存儲爲INT或BIGINT)是整數,並且始終爲UTC。它們是自1970年1月1日午夜以來經過的秒數。由於它們始終是UTC,因此可以很容易地轉換到給定時區或來自給定時區。 MySQL中的'UNIX_TIMESTAMP()'以UTC保存當前時間戳。這是否清除任何混亂或使情況變得更糟? – drew010 2012-07-26 00:29:33

+0

是的,它到達那裏= D我想唯一的問題是PicK你想要的時區,並從那裏去。不再是UTC的真正粉絲了,如果您選擇時區並將其用作DateTime格式的參考,則可以進行任何時區轉換或日期更改,而不需要1970年的限制。我猜你可以隨時把你的時區變成UTC。僅使用日期時間有什麼缺點?再次感謝您的幫助btw! – DevilCode 2012-07-26 01:39:43