2010-09-25 39 views

Trả lời

10

date()localtime() đều sử dụng các múi giờ địa phương cho máy chủ trừ khi ghi đè; bạn có thể ghi đè múi giờ được sử dụng với 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

Nhưng làm cách nào để nhận dấu thời gian UTC hiện tại? – Mark

+0

Tại sao bạn cần dấu thời gian UTC hiện tại để chuyển đổi dấu thời gian UTC đã lưu? – Amber

+0

Nhưng nếu bạn làm, 'time()' luôn trả về UTC: http://us2.php.net/manual/en/function.time.php – Amber

49

strtotime chức năng PHP sẽ giải thích mã múi giờ cũng như tính theo giờ UTC. Nếu bạn nhận được ngày từ cơ sở dữ liệu/ứng dụng khách mà không có mã múi giờ, nhưng biết đó là UTC, thì bạn có thể thêm nó vào.

Giả sử bạn có được ngày với mã timestamp (như "Fri ngày 23 tháng 3 năm 2012 22:23:03 GMT-0700 (PDT)", đó là những gì mã JavaScript ""+(new Date()) cho):

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

Hoặc nếu bạn không, đó là khả năng từ MySQL, sau đó:

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

Đoạn mã thứ hai là thứ tôi cần để chuyển đổi đầu ra của hàm 'datetime()' của sqlite từ UTC thành localtime. – fuenfundachtzig

+0

Cảm ơn bạn, bạn đã tiết kiệm thời gian của tôi. – Abbas

6

Đầu tiên, có được ngày trong UTC - bạn đã làm được điều đó nên bước này sẽ thực sự chỉ là một cuộc gọi cơ sở dữ liệu:

$timezone = "UTC"; 
date_default_timezone_set($timezone); 

$utc = gmdate("M d Y h:i:s A"); 
print "UTC: " . date('r', strtotime($utc)) . "\n"; 

Tiếp theo, thiết lập múi giờ địa phương của bạn trong PHP:

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

Và bây giờ được bù đắp trong vài giây:

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

Cuối cùng, thêm bù đắp cho timestamp nguyên của datetime ban đầu của bạn:

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

Hoặc, chính xác hơn: $ local = date (định dạng $, strtotime ("$ utc $ offset giây")); – fijiaaron

+0

ngày arithmatic là không cần thiết nếu bạn có timezones – fijiaaron

7

Số học ngày không cần thiết nếu bạn chỉ muốn hiển thị cùng một dấu thời gian trong các múi giờ khác nhau:

$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

trả lời

Chuyển đổi UTC datetime sang Mỹ/Denver

// 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'); 

Ghi chú

time() trả về unix timestamp, đó là một con số, nó không có múi giờ.

date('Y-m-d H:i:s T') trả về ngày trong múi giờ miền địa phương hiện tại.

gmdate('Y-m-d H:i:s T') trả về ngày trong UTC

date_default_timezone_set() thay đổi locale múi giờ hiện tại

để thay đổi một thời gian trong một múi giờ

// 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'); 

đây bạn có thể xem tất cả các múi giờ sẵn

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

đây là tất cả các tùy chọn định dạng

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

Update PHP múi giờ DB (trong linux)

sudo pecl install timezonedb 
+2

Điều này sẽ là câu trả lời cho câu hỏi trên .. –

+0

Điều này thực sự trả lời câu hỏi chứ không phải là cung cấp "làm thế nào để có được thời gian địa phương." – ChristoKiwi

1

tôi lưu trữ ngày trong DB ở định dạng UTC nhưng sau đó tôi chỉ cho họ để người sử dụng chính thức trong múi giờ địa phương của họ

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

Làm thế nào là dfferent này từ câu trả lời được đưa ra ở trên? – Martin

+0

Infact nếu bạn muốn viết lại và mở rộng việc sử dụng lớp PHP DateTime mới hơn, câu trả lời của bạn có thể là một cách duy nhất mới để đạt được kết quả mong muốn. – Martin

1

Đây là cách thẳng để chuyển đổi thời gian UTC của người hỏi thành giờ địa phương e. Đây là thời gian được lưu trữ trong cơ sở dữ liệu, vd: mọi thời gian. Bạn chỉ cần tìm sự khác biệt về thời gian giữa thời gian UTC và giờ địa phương bạn quan tâm và sau đó điều chỉnh thời gian UTC đã lưu để thêm vào sự khác biệt.

$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 

Sau đó, bạn có thể thêm sự khác biệt này vào thời gian UTC được lưu trữ. (Ở vị trí của tôi, Athens, sự khác biệt chính xác là 5:00:00)

0

Với múi giờ địa phương, chẳng hạn như 'America/Denver', bạn có thể sử dụng lớp DateTime để chuyển đổi dấu thời gian UTC thành ngày địa phương:

$timestamp = *********; 
$date = new DateTime("@" . $timestamp); 
$date->setTimezone(new DateTimeZone('America/Denver')); 
echo $date->format('Y-m-d H:i:s'); 
Các vấn đề liên quan