Php 用时区计算时差

Php 用时区计算时差,php,datetime,Php,Datetime,我有一个PHP页面和一个数据库,其中我了解以下内容: 服务器时间(运行PHP和DB的服务器) 用户时区 存储在DB中的事件的日期/时间 我的系统允许用户取消事件(加盖特定时间戳),我需要根据用户当前时区确定事件是否在用户时间的12小时内。例如,假设我有以下内容: 服务器时间(GMT):2017年7月1日下午3:30 用户时区:(格林尼治标准时间-7:00)山区时间(美国和加拿大) 活动日期/时间:2017年7月1日下午8:30(山区时间) 根据已知时区计算用户当前时间和事件时间之间的小时

我有一个PHP页面和一个数据库,其中我了解以下内容:

  • 服务器时间(运行PHP和DB的服务器)
  • 用户时区
  • 存储在DB中的事件的日期/时间
我的系统允许用户取消事件(加盖特定时间戳),我需要根据用户当前时区确定事件是否在用户时间的12小时内。例如,假设我有以下内容:

  • 服务器时间(GMT):2017年7月1日下午3:30
  • 用户时区:(格林尼治标准时间-7:00)山区时间(美国和加拿大)
  • 活动日期/时间:2017年7月1日下午8:30(山区时间)
根据已知时区计算用户当前时间和事件时间之间的小时数的PHP公式是什么?注意:我们有许多用户在不同的时区,但我们知道他们的时区,因为我们将其存储在每个用户的数据库记录中。为了解决这个问题,我们首先需要通过计算服务器时间及其时区来计算用户的当前时间。然后我们需要在它们的当前时间和事件时间之间做一个减法


我存储的时区值是以下格式的小数:
-7.0
(即山区时间,比格林尼治标准时间晚7小时)。无论发生什么时区计算,都需要能够采用这样的小数

PHP代码是如何做到这一点的?

使用PHP的DateTime类的diff()方法,如下所示:-

$user_time= new DateTime('.....',new DateTimeZone('Pacific/Nauru'));
$event_time= new DateTime('....',new DateTimeZone('Pacific/Nauru'));
var_dump($event_time->diff($user_time));
这将为您提供一个DateInterval对象:-

object(DateInterval)[48]
  public 'y' => int 0
  public 'm' => int 0
  public 'd' => int 2
  public 'h' => int 11
  public 'i' => int 34
  public 's' => int 41
  public 'invert' => int 0
  public 'days' => int 2
从中检索所需的值非常简单。

使用PHP的DateTime类的diff()方法,如下所示:-

$user_time= new DateTime('.....',new DateTimeZone('Pacific/Nauru'));
$event_time= new DateTime('....',new DateTimeZone('Pacific/Nauru'));
var_dump($event_time->diff($user_time));
这将为您提供一个DateInterval对象:-

object(DateInterval)[48]
  public 'y' => int 0
  public 'm' => int 0
  public 'd' => int 2
  public 'h' => int 11
  public 'i' => int 34
  public 's' => int 41
  public 'invert' => int 0
  public 'days' => int 2

从中检索所需的值是微不足道的。

在StackOverflow上,您需要编写自己的代码,如果某些代码不起作用,我们会很乐意帮助您修复,但您需要自己研究和编写大部分代码。请查看,如果可以,请使用它!在StackOverflow上,您需要编写自己的代码,如果某些东西不起作用,我们将很乐意帮助您修复它,但您需要自己研究并编写大部分代码。请查看,如果可以,请使用它!Omis这看起来很有希望,但时区必须考虑到等式中,才能获得正确的$user\u时间。这是怎么做到的?我将编辑我的答案,这样你就可以看到包括时区在内的变化。我只得到空白:
$user_time=new DateTime('2017-05-22 13:48:20',new DateTimeZone('Pacific/Nauru')$事件时间=新日期时间('2017-05-22 02:48:20');回声“;变量转储($event\u time->diff($user\u time));回声“我存储的时区值是以下格式的小数:
-7.0
(即山区时间,比格林尼治标准时间晚7小时)。无论发生什么时区计算,都需要能够采用那样的小数。Omis这看起来很有希望,但时区必须考虑到等式中的因素,才能获得正确的$user\u时间。这是怎么做到的?我将编辑我的答案,这样你就可以看到包括时区在内的变化。我只得到空白:
$user_time=new DateTime('2017-05-22 13:48:20',new DateTimeZone('Pacific/Nauru')$事件时间=新日期时间('2017-05-22 02:48:20');回声“;变量转储($event\u time->diff($user\u time));回声“我存储的时区值是以下格式的小数:
-7.0
(即山区时间,比格林尼治标准时间晚7小时)。无论发生什么时区计算,都需要能够采用这样的小数。