计算UTC时间,当我知道时区和该时区的时间
问题描述:
我有一个遗留系统,随着时间的推移会产生一些魔力。计算UTC时间,当我知道时区和该时区的时间
我可以设置时区(例如:。在遗留系统Europe/Bucharest
某处的管理员可以在后台地方输入时间,但它永远是UTC时间
一旦时间被保存在数据库会考虑到上面设置的时区,所以即使管理员输入了下午10点,数据库中的时间将是下午7点(是的,这是有点愚蠢,我同意)
如果我要直接来自数据库的时间,我正在做的时间将不会是管理员实际进入的时间,它会调整到时区。
长话短说:如果我知道该时区的时区和时间,我该如何计算正确的UTC时间?例如:从下午7点到晚上10点,我知道时区为Europe/Bucharest
。我想以一种非常危险的方式来做到这一点。
答
我的理解是你的系统存储的日期为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');
答
要回答我的问题我猜...
(如果有人想补充或更正我,真的,请不要)。
$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');
'createFromFormat()'的真正之处在于它允许整个事物成为一个单一的线程:''echo DateTime :: createFromFormat('Ymd \ TH:i:s',$ database_time,new DateTimeZone('UTC' )) - > setTimezone(new DateTimeZone('Europe/Warsaw')) - > format('Ymd H:i:s');':) – Narf
你很接近,而不是与代码,理解。存储在数据库中的时间在当前时区(与示例“Europe/Bucharest”保持一致)。 – Andrew
好的,在这种情况下,我的答案中的第二个示例仍然会执行,您只需要假设$ local_time实际上是您尝试转换为UTC的时间。 –