2017-09-04 111 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

相关问题