将用户提交日期转换为UTC



我试图弄清楚如何从表单中接受日期/时间,因此在用户的时区中,并在将其插入数据库之前将其更改为UTC。不知为什么,我找了多少遍也找不到答案。

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

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

我希望在我的表单上使用Date().getTimezoneOffset()来提交用户的UTC偏移量(详见此处)。

$userOffset = $_POST['user_offset']

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

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

我在这里错过了什么?PHP有没有我不知道的函数让我可以这样做:

$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

还是我让事情变得更困难了?


编辑

根据@vascowhite提供的解决方案,我采取了以下措施(为寻求指导的人添加问题以改进答案)

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

HTML:

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

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

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

class MyDate {
   /**
    * Convert Date to UTC
    * 
    * @param string $date      Any date parsable with strtotime()
    * @param string $offset    UTC offset of date
    */
   public static function toUTC($date, $offset = '+0:00')
   {
       if ($timestamp = strtotime($date) && ! empty($offset) )
       {
           $newDate = date('Y-m-d H:i:s', $timestamp);
           $newDate = new DateTime($date . ' ' . $offset);
           $newDate->setTimezone(new DateTimeZone('UTC'));
           $date = $newDate->format('Y-m-d H:i:s');
       }
       return $date;
   }
}
// To convert
$userDate = trim($_POST['user_offset']);
$userOffset = trim($_POST['user_date']);
$utc = MyDate::toUTC($userDate, $userOffset)

这个类方法并不完美,如果出现问题,它只是返回日期——而实际上它应该抛出异常。

这是一个使用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中处理日期和时间,那么花点时间熟悉这些非常有用的类是值得的。

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

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

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

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

欢呼

相关内容

  • 没有找到相关文章

最新更新