簡體   English   中英

PHP的UTC時間戳

[英]php mysql UTC timestamp

我處於構建mysql表的早期階段,該表將保存來自兩個時區的數據。 我的機器和服務器都位於America / Los_Angeles時區。 時區表未加載到mysql服務器中,但是在此站點的其他地方,我已經讀過這是沒有必要的,只要php處理查詢即可-php會將UTC偏移量寫入mysql。 Mysql數據類型為TIMESTAMP。 示例數據已通過包含以下語句的php腳本插入:

        if($company == 'HOS_CIN' or $company == 'HOS_FER') {
        date_default_timezone_set("America/New_York");
    }

然后使用兩個PHP腳本在瀏覽器中顯示數據。 其中一項包括上述聲明,而另一項則沒有。 一條帶有該語句的語句將時間顯示為美國東部標准時間(EST),另一條沒有該語句的語句將其顯示為美國中部標准時間(PST)。 如果mysql已經存儲了UTC偏移量,顯示的時間應該不存在三個小時的差異嗎?

PHP版本5.3.3,MySQL版本5.0.95

您必須面對有關PHP和MySQL的以下限制:

  • MySQL沒有任何允許存儲帶有時區信息的本地時間的列類型。

  • PHP無法將復雜的數據類型(例如DateTime實例)傳遞給MySQL,一切都需要進行字符串化,並且MySQL沒有語法來傳遞帶有時區信息的日期文字。

實際上,這並不像看起來那樣糟糕,因為您通常不需要插入信息的用戶的本地時間:您只需要知道存儲日期所指的確切時間,然后(可選)必須在其中顯示存儲日期的時區。 基本上有三種明智的方法:

  1. 使用不受時區影響的格式,例如,存儲為INT的Unix時間戳。

  2. 使用帶有明確時區信息的date列類型,例如TIMESTAMP列(不要與Unix時間戳混淆),其中時區始終為UTC。

  3. 使用帶有隱式時區信息的date列類型,例如DATEDATETIME列,在該列中您已確定所有日期都屬於給定時區,可能是UTC。

#2和#3之間的區別在於MySQL是否了解時區,還是只有您和您的代碼才知道的東西。

無論選擇哪種方法,都必須向所有預期進行時區轉換的程序都指示要使用的時區:

  • PHP需要時區來生成/顯示Unix時間戳,以及將用戶輸入/期望的本地時間和MySQL期望/打印的本地時間之間的轉換/轉換為本地時間,例如:

     $user_date = new DateTime('2016-10-03 00:00:00', new DateTimeZone('Europe/Berlin')); $user_date->setTimezone(new DateTimeZone('UTC')); echo $user_date->format('c'); 
  • 當您使用TIMESTAMP列時,MySQL需要時區來與本地時間進行轉換,例如:

     mysql> create table foo( -> foo int(10) unsigned auto_increment, -> my_date timestamp, -> primary key (foo) -> ); Query OK, 0 rows affected (0.00 sec) mysql> set @@time_zone = '+01:00'; Query OK, 0 rows affected (0.00 sec) mysql> insert into foo (my_date) values ('2016-12-27 18:50:00'); Query OK, 1 row affected (0.00 sec) mysql> set @@time_zone = '-07:00'; Query OK, 0 rows affected (0.00 sec) mysql> insert into foo (my_date) values ('2016-12-27 18:50:00'); Query OK, 1 row affected (0.00 sec) mysql> select * from foo order by 1; +-----+---------------------+ | foo | my_date | +-----+---------------------+ | 1 | 2016-12-27 10:50:00 | | 2 | 2016-12-27 18:50:00 | +-----+---------------------+ 2 rows in set (0.00 sec) mysql> set @@time_zone = '+09:30'; Query OK, 0 rows affected (0.00 sec) mysql> select * from foo order by 1; +-----+---------------------+ | foo | my_date | +-----+---------------------+ | 1 | 2016-12-28 03:20:00 | | 2 | 2016-12-28 11:20:00 | +-----+---------------------+ 2 rows in set (0.00 sec) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM