将用户提交的日期转换为UTC

时间:2014-05-15 20:46:04

标签: php date timezone utc

我试图弄清楚如何从表单接受日期/时间,因此在用户的时区中,并在将其插入数据库之前将其更改为UTC。出于某种原因,没有多少搜索让我得到答案。

我的表单将POST用户选择的任何日期到我的代码,所以我希望能够做这样的事情。注意:$userDate可能与基于用户位置的任意数量的时区相关

$userDate = $_POST['user_date'] // 2014-05-15 16:37:23

我预计在我的表单上使用Date().getTimezoneOffset()也会提交用户UTC偏移量(as detailed here)

$userOffset = $_POST['user_offset']

然后在将日期插入我的数据库之前,我想将其转换为UTC - 但我对如何使用PHP进行操作感到困惑(我实际上使用的是Laravel,所以如果你知道使用的方法碳,这将更容易,但我无法在他们的文档中找到它。

我一直试图手动解析偏移量并将其转换为秒数,并将其加到或减去strtotime()的{​​{1}}输出,然后将其转换回日期格式使用$userDate - 但必须有更好的方法!

我在这里缺少什么? PHP是否具有我不知道的功能,让我可以执行以下操作:

date()

或者我是否比现在更努力?


修改

根据@vascowhite提供的解决方案,我选择了以下内容(添加了问题以改善那些寻求指导的人的答案)

我最终使用moment.js中的函数,因为我已经使用它将UTC转换为用户的时区显示。

HTML:

$userDate = '2014-05-15 16:37:23';
$userOffset = '+04:00';
$utcDate = date_apply_offset($userDate, $userOffset);

echo $utcDate; // Outputs: 2014-05-15 20:37:23

使用Javascript:

<input id="user_offset" type="hidden" name="user_offset" value="">

PHP(在自定义日期类中):

 var offset = moment().format('ZZ');
 $('#user_offset').val(offset);

那个类方法并不完美,如果出现问题,它只会返回日期 - 当它确实应该抛出异常时。

2 个答案:

答案 0 :(得分:2)

这是DateTime类的简单任务: -

$userDate = '2014-05-15 16:37:23';
$userOffset = '+04:00';

$date = new \DateTime($userDate . ' ' . $userOffset);
var_dump($date);
$date->setTimezone(new \DateTimeZone('UTC'));
var_dump($date);

然后您可以根据需要格式化日期,例如: -

echo $date->format('Y-m-d H:i:s');

或: -

$utcDate = $date->format('Y-m-d H:i:s');
echo $utcDate; // Outputs: 2014-05-15 20:37:23

See it working

如果您正在使用PHP中的日期和时间进行任何工作,那么值得花些时间熟悉这些非常有用的类。

答案 1 :(得分:0)

对于各种日期/时间操作,您可以使用moment.php

对于您的示例,所需的只是两行代码:

$m = new \Moment\Moment('2014-05-15 16:37:23', '+0400');
echo $m->setTimezone('UTC')->format(); // 2014-05-15T12:37:23+0000

还有更多有助于处理日期/时间问题:https://github.com/fightbulc/moment.php

干杯