2017-09-04 108 views
0

我有一個遺留系統,隨着時間的推移會產生一些魔力。計算UTC時間,當我知道時區和該時區的時間

我可以設置時區(例如:。在遺留系統Europe/Bucharest某處的管理員可以在後臺地方輸入時間,但它永遠是UTC時間

一旦時間被保存在數據庫會考慮到上面設置的時區,所以即使管理員輸入了下午10點,數據庫中的時間將是下午7點(是的,這是有點愚蠢,我同意)

如果我要直接來自數據庫的時間,我正在做的時間將不會是管理員實際進入的時間,它會調整到時區。

長話短說:如果我知道該時區的時區和時間,我該如何計算正確的UTC時間?例如:從下午7點到晚上10點,我知道時區爲Europe/Bucharest。我想以一種非常危險的方式來做到這一點。

回答

2

我的理解是你的系統存儲的日期爲UTC(這是一個好主意,如果該系統可能需要由用戶從不同的時區訪問)。我也明白,當管理員輸入日期時,它會在保存到數據庫之前轉換爲UTC(這也是相當明智的做法)?現在,你需要能夠從數據庫中讀取並在當地時出示日期:

$database_time = '2017-09-02T21:00:00'; 
$date_obj = DateTime::createFromFormat('Y-m-d\TH:i:s', $database_time, new DateTimeZone('UTC')); 
$your_tz = new DateTimeZone('Europe/Warsaw'); 
$date_obj->setTimeZone($your_tz); 
var_dump($date_obj); 

如果你需要做的相反(節省的本地時間爲DB UTC或只顯示UTC時間),然後:

$local_time = '2017-09-02T23:00:00'; 
$date_obj = DateTime::createFromFormat('Y-m-d\TH:i:s', $database_time, new DateTimeZone('Europe/Warsaw')); 
$db_tz = new DateTimeZone('UTC'); 
var_dump($date_obj); 

然而,如果已知時區數據庫中存儲數據,而你只需要那個時候UTC它的物質轉化:

$database_time = '2017-09-02T21:00:00'; 
$date_obj = DateTime::createFromFormat('Y-m-d\TH:i:s', $database_time, new DateTimeZone('Europe/Warsaw')); 
$date_obj->setTimeZone(new DateTimeZone('UTC')); 
echo $date_obj->format('Y-m-d\TH:i:s'); 
+1

'createFromFormat()'的真正之處在於它允許整個事物成爲一個單一的線程:''echo DateTime :: createFromFormat('Ymd \ TH:i:s',$ database_time,new DateTimeZone('UTC' )) - > setTimezone(new DateTimeZone('Europe/Warsaw')) - > format('Ymd H:i:s');':) – Narf

+0

你很接近,而不是與代碼,理解。存儲在數據庫中的時間在當前時區(與示例「Europe/Bucharest」保持一致)。 – Andrew

+0

好的,在這種情況下,我的答案中的第二個示例仍然會執行,您只需要假設$ local_time實際上是您嘗試轉換爲UTC的時間。 –

0

要回答我的問題我猜...

(如果有人想補充或更正我,真的,請不要)。

$database_time = '2017-09-02T21:00:00'; 

$diff = date('Z', strtotime($database_time))/3600; // to get the diff in hours, by default it's in seconds 

$UTC_time = (new DateTime($database_time))->modify("+ $diff hour"); 

$UTC_time->format('m-d-Y H:i:s'); 
+0

@ Jarek.D的答案是技術上更好。 – Narf

+0

同意,更好的答案。 – Andrew

相關問題