2012-12-04 52 views
7

我正在處理日曆應用程序。來自不同時區的這些用戶創建/查看事件。 我想按照下面的方法保存UTC中的事件時間並將它們顯示在用戶的當地時間。注意:用戶有他們的首選時區設置。時區與DST處理由PHP

爲了節省事件開始時間爲UTC時間戳:

$timezone = new DateTimeZone($user_timezone_name); 
$utcOffset = $timezone->getOffset(new DateTime($event_start_time_string_local)); 
$event_start_timestamp_local = maketime($event_start_time_string_local); 
//Now add/subtract $utcOffset to/from $event_start_timestamp_local to get event's start //time timestamp in UTC and save this result in DB. 

要獲取事件的用戶的時區開始時間:

date_default_timezone_set($user_timezone_name); 
$eventTimeLocalTime = date("Y-m-d H:i:s", $event_start_timestamp_in_UTC); 

其中:

user_timezone_name is user's timezone setting. 
event_start_time_string_local is event's start time string in local/civil time. 
event_start_timestamp_in_UTC is event's start time timestamp in UTC. 

我的問題:

  • 以上使用的PHP API是否爲所有地區的DST提供服務?
  • DST時間本身在不同年份發生變化,PHP如何獲得有關此信息?我們需要升級PHP嗎?如果是這樣,我們需要升級所有或特定的PHP庫?

參考文獻: - does-phps-date-default-timezone-set-adjust-to-daylight-saving - get-timezone-offset-for-a-given-location

回答

14

你太過分複雜這一點。要使用DateTime 2個時區之間進行轉換,這樣做:

date_default_timezone_set('Asia/Kolkata'); // YOUR timezone, of the server 

$date = new DateTime($input, new DateTimeZone('Asia/Tokyo')); // USER's timezone 
$date->setTimezone(new DateTimeZone('UTC')); 
echo $date->format('Y-m-d H:i:s'); 

這從用戶的本地時區爲UTC轉換。要反過來,要在用戶當地時間顯示時間,交換兩個時區。

是的,PHP負責DST。必要的轉換規則是PHP安裝的一部分。您可以通過更新PHP或更新timezonedb來保持它們最新:http://pecl.php.net/package/timezonedb

+3

更新timezonedb是一項常規任務,每年需要多次,因爲每當任何國家做了更改,它都會得到更新 - 而且這種情況發生頻率很高。 – Sven

+0

非常感謝,我會用這個 –

+3

爲什麼我們需要在開始時調用'date_default_timezone_set('Asia/Kolkata')'? –

4

是的php api考慮到了DST。大多數情況下,你可以按照欺騙的方式安全地進行時間轉換。問題在於,它並不總是可行的或可行的或有意義的。考慮下面的例子 - 在波蘭(2013年)10月27日凌晨3點,您的時鐘返回1小時切換到3月31日凌晨2點的標準時間(抵消UTC + 01:00),向前調整1小時以切換到夏季時間(抵消UTC + 02:00)。現在讓我們來看看「實時」如何蜱Grenwich/UTC和轉換通過PHP從歐洲/華沙UTC是如何工作的:

Europe/Warsaw time offset UTC     php2utc conversion php offset 
2013-10-27 01:00:00 +2 2013-10-26 23:00:00 2013-10-26 23:00:00 +2 
2013-10-27 01:30:00 +2 2013-10-26 23:30:00 2013-10-26 23:30:00 +2 
2013-10-27 02:00:00 +2 2013-10-27 00:00:00 2013-10-27 01:00:00 +1 * 
2013-10-27 02:30:00 +2 2013-10-27 00:30:00 2013-10-27 01:30:00 +1 * 
2013-10-27 02:59:00 +2 2013-10-27 00:59:00 2013-10-27 01:59:00 +1 * 
    3am -> 2am .....................................summer time changes to standard(winter) time @3am we subtract 1h so 3am becomes 2am 
2013-10-27 02:00:00 +1 2013-10-27 01:00:00 2013-10-27 01:00:00 +1 
2013-10-27 02:30:00 +1 2013-10-27 01:30:00 2013-10-27 01:30:00 +1 
2013-10-27 03:00:00 +1 2013-10-27 02:00:00 2013-10-27 02:00:00 +1 
2013-10-27 03:30:00 +1 2013-10-27 02:30:00 2013-10-27 02:30:00 +1 

正如你可以在2 am-3am之間看有沒有辦法PHP可以知道「,這'小時(從調整前/調整後),因此不能可靠地轉換。 希望這有助於他/她的審議;-)

+0

這是一個很好的捕獲。 – 2017-05-15 22:02:34