我试图弄清楚如何从表单接受日期/时间,因此在用户的时区中,并在将其插入数据库之前将其更改为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);
那个类方法并不完美,如果出现问题,它只会返回日期 - 当它确实应该抛出异常时。
答案 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
如果您正在使用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
干杯