2010-09-25 245 views
22

我存儲UTC日期到數據庫使用:轉換UTC日期爲本地時間在PHP

$utc = gmdate("M d Y h:i:s A"); 

,然後我想保存的UTC日期轉換到客戶端的本地時間。

我該怎麼做?

感謝

回答

10

date()localtime()都使用了,除非覆蓋了服務器的本地時區;您可以覆蓋使用date_default_timezone_set()的時區。

http://www.php.net/manual/en/function.date-default-timezone-set.php

http://us3.php.net/manual/en/function.date.php

http://php.net/manual/en/function.localtime.php

+1

但是,如何獲取當前UTC時間戳? – Mark 2010-09-25 01:35:09

+0

爲什麼你需要當前的UTC時間戳來轉換保存的UTC時間戳? – Amber 2010-09-25 01:35:58

+0

但如果你這樣做,'time()'總是返回UTC:http://us2.php.net/manual/en/function.time.php – Amber 2010-09-25 01:36:24

49

PHP的strtotime功能將演繹時區代碼,像UTC。如果你從沒有時區代碼的數據庫/客戶端獲得日期,但知道它是UTC,那麼你可以追加它。

假設你得到時間戳代碼的日期(如 「週五2012年3月23日22時23分03秒GMT-0700(PDT)」,這是Javascript代碼""+(new Date())給出):

$time = strtotime($dateWithTimeZone); 
$dateInLocal = date("Y-m-d H:i:s", $time); 

或者,如果你不這樣做,這可能是從MySQL,那麼:

$time = strtotime($dateInUTC.' UTC'); 
$dateInLocal = date("Y-m-d H:i:s", $time); 
+3

第二個代碼片段是我需要將sqlite的datetime()函數的輸出從UTC轉換爲localtime所需的代碼片段。 – fuenfundachtzig 2014-10-06 13:10:48

+0

謝謝,你節省了我的時間。 – Abbas 2015-12-12 10:49:35

6

首先,獲取日期在UTC - 你已經這樣做了所以這一步真的只是一個數據庫調用:

接下來,設置你的本地時區在PHP中:

$timezone = "America/Guayaquil"; 
date_default_timezone_set($timezone); 

並立即在幾秒鐘內偏移:

$offset = date('Z', strtotime($utc)); 
print "offset: $offset \n"; 

最後,添加偏移到你原來的日期時間的整數時間戳:

print "LOCAL: " . date('r', strtotime($utc) + $offset) . "\n"; 
+1

或者更簡潔地說: $ local = date($ format,strtotime(「$ utc $ offset seconds」)); – fijiaaron 2012-05-18 18:19:09

+0

日期算術是不需要的,如果你有時區 – fijiaaron 2012-05-18 19:23:09

7

如果您只是想在不同的時區顯示相同的時間戳,則不需要日期算術:

$format = "M d, Y h:ia"; 
$timestamp = gmdate($format); 

date_default_timezone_set("UTC"); 
$utc_datetime = date($format, $timestamp); 

date_default_timezone_set("America/Guayaquil"); 
$local_datetime = date($format, $timestamp); 
30

回答

轉換的UTC日期時間美洲/丹佛

// create a $dt object with the UTC timezone 
$dt = new DateTime('2016-12-12 12:12:12', new DateTimeZone('UTC')); 

// change the timezone of the object without changing it's time 
$dt->setTimezone(new DateTimeZone('America/Denver')); 

// format the datetime 
$dt->format('Y-m-d H:i:s T'); 

time()返回unix timestamp,這是一個數字,它沒有時區。

date('Y-m-d H:i:s T')返回當前語言環境時區中的日期。

gmdate('Y-m-d H:i:s T')返回UTC日期

date_default_timezone_set()改變當前區域設置時區

更改時間的時區

// create a $dt object with the America/Denver timezone 
$dt = new DateTime('2016-12-12 12:12:12', new DateTimeZone('America/Denver')); 

// change the timezone of the object without changing it's time 
$dt->setTimezone(new DateTimeZone('UTC')); 

// format the datetime 
$dt->format('Y-m-d H:i:s T'); 

在這裏你可以看到所有可用的時區

https://en.wikipedia.org/wiki/List_of_tz_database_time_zones

這裏有所有的格式選項

http://php.net/manual/en/function.date.php

更新PHP時區數據庫(在Linux)

sudo pecl install timezonedb 
+2

這應該是上述問題的答案。 – 2016-08-10 15:11:07

+0

這實際上回答了問題,而不是提供「如何獲得當地時間」。 – ChristoKiwi 2017-10-23 20:54:30

1

我在DB存儲日期UTC格式,但然後我把它們展示給最終用戶在他們當地的時區

// retrieve 
$d = (new \DateTime($val . ' UTC'))->format('U'); 
return date("Y-m-d H:i:s", $d); 
+0

從上面給出的答案,這是如何不同? – Martin 2016-09-21 09:12:47

+0

事實上,如果你想重寫和擴展新的PHP DateTime類的使用,你的答案可能是實現期望結果的一種新的獨特方式。 – Martin 2016-09-21 09:13:52

1

這裏是直接將提問者的UTC時間轉換爲本地時間即這是存儲在數據庫中的時間等,即任何時間。你只需要找到UTC時間和你感興趣的當地時間之間的時差,然後調整存儲的UTC時間就可以增加差異。

$df = "G:i:s"; // Use a simple time format to find the difference 
$ts1 = strtotime(date($df)); // Timestamp of current local time 
$ts2 = strtotime(gmdate($df)); // Timestamp of current UTC time 
$ts3 = $ts1-$ts2;    // Their difference 

然後,您可以將此差異添加到存儲的UTC時間。 (在我的位置,雅典,差異恰恰是5:00:00)

0

鑑於當地時區,例如'America/Denver',您可以使用DateTime類將UTC時間戳轉換爲當地日期:

$timestamp = *********; 
$date = new DateTime("@" . $timestamp); 
$date->setTimezone(new DateTimeZone('America/Denver')); 
echo $date->format('Y-m-d H:i:s'); 
相關問題