我有一个遗留系统随着时间的推移做一些魔术。
我可以在遗留系统中的某处设置时区(例如:Europe/Bucharest
。管理员可以在后端某处输入 BUT 的时间,它始终是UTC时间。
一旦将时间保存在数据库中,它将考虑上述设定的时区。因此,即使管理员输入说晚上10点,数据库中的时间也是下午7点(是的,它有点愚蠢,我同意)。
如果我是直接从我正在做的数据库中抽出时间,那么时间不会是管理员实际输入的时间,而是会调整到时区。
长话短说:如果我知道该时区的时区和时间,我该如何计算正确的UTC时间?例如:从晚上7点到晚上10点,我知道时区是Europe/Bucharest
。我想以一种非黑客的方式做到这一点。
答案 0 :(得分:2)
我的理解是你的系统将日期存储为UTC(如果系统可能需要不同时区的用户访问,这是一个好主意)。我也明白,当管理员输入日期时,它会在保存到DB之前转换为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);
如果您需要执行相反操作(将当地时间保存为数据库中的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 :(得分: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');