Php DateTime::diff()不是';t受时区影响,但始终返回相同的值
我正在将基于拍卖的数据添加到我的系统中。例如:Php DateTime::diff()不是';t受时区影响,但始终返回相同的值,php,datetime,timezone,Php,Datetime,Timezone,我正在将基于拍卖的数据添加到我的系统中。例如: user's timezone is : `America/Denver` auction start time is : Thu, 21 Jun 2012 03:46:22 AM auction period : 1 day. auction end time : Fri, 22 Jun 2012 03:46:22 AM 我将所有这些信息按原样存储在数据库中(即,所有存储的时间基于用户的时区) 现在我想要结束时间和当前时间(美国/丹佛时区)之
user's timezone is : `America/Denver`
auction start time is : Thu, 21 Jun 2012 03:46:22 AM
auction period : 1 day.
auction end time : Fri, 22 Jun 2012 03:46:22 AM
我将所有这些信息按原样存储在数据库中(即,所有存储的时间基于用户的时区)
现在我想要结束时间和当前时间(美国/丹佛时区)之间的实际差异
我使用了函数
所以即使我也不转换时区;它返回相同的差异(这也是错误的)
我的PHP代码如下;你也可以在
返回:
object(DateInterval)[4]
public 'y' => int 0
public 'm' => int 0
public 'd' => int 0
public 'h' => int 16
public 'i' => int 40
public 's' => int 24
public 'invert' => int 0
public 'days' => int 6015
参考文献:
- 在以下几行中,您基本上是说结束日期是格林尼治标准时间,而应该是美国/丹佛时间:
$to = new DateTime($end, new DateTimeZone('GMT'));
然后您打算将其转换为美国/丹佛时间,但由于您使用GMT时区创建了日期,因此无论如何这都是错误的
// $to ->setTimeZone($owner_tz);
这将使用用户时区创建结束日期,这可能是您正在寻找的:
$to = new DateTime($end, $owner_tz);
我得到了解决方案,所以我想与大家分享 实际上,我已经在
config.inc.php
文件中设置了默认时区,如下所示
date\u default\u timezone\u set('America/Los\u Angeles')代码>
然后我用下面的查询从phpmyadmin检查MySQL服务器的当前时区
SELECT NOW(), SYSDATE(), @@global.time_zone , @@session.time_zone ,
TIMEDIFF( NOW( ) , CONVERT_TZ( NOW( ) , @@session.time_zone , '+00:00' ))
AS OFFSET
这将返回偏移量值+05:30
解决步骤:
- 首先,我将mySQL服务器的时区更改为GMT/UTC+00:00(我在mySQL服务器上拥有super权限)
- 我们使用
start\u date=NOW()
保存日期和时间(列数据类型:DATETIME
)
现在有两种方法可以根据用户的时区获取日期和时间(America/Denver
)
第一种方法(使用PHP)
第二种方法(使用MySQL)
注意:不要使用strotime()
将开始日期更改为时间戳。它将返回与UNIX\u TIMESTAMP()不同的值
i、 e
根据用户的时区存储日期/时间信息是一种非常糟糕的做法,如果用户更改了他/她的时区该怎么办?一个好的做法是存储所有的日期/时间信息,而不使用时区(如UTC时间戳),这样您就可以最大限度地减少转换和计算操作的数量,因此在向用户输出日期/时间时只需担心设置正确的时区。我的列数据类型是datetime
,所以,当我存储数据时,我需要做些什么更改,因为datetime的发布数据将作为用户的时区出现。我不是说你需要更改你的应用程序,这只是一个建议。您是否已将日期\默认\时区\设置放在某个位置以确保您的服务器时间正确?是的,我已在配置文件中进行了设置。但是你的想法真的很好。我以前也有过这种想法,但这里的重点是为什么日期差异显示错误的结果??不!我已经评论了这句话。我不想更改它,因为在添加拍卖时,结束时间已经按照用户的时区保存。正如我所说的,您打算这样做,但第一行是您犯错误的地方。让我把答案改写一下。没有区别,两者是等价的。您可以检查.sonewdatetime($end,$owner\utz)代码>=newdatetime($end,newdatetimezone('GMT')->setTimeZone($owner_z);
SELECT NOW(), SYSDATE(), @@global.time_zone , @@session.time_zone ,
TIMEDIFF( NOW( ) , CONVERT_TZ( NOW( ) , @@session.time_zone , '+00:00' ))
AS OFFSET
SET GLOBAL time_zone = '+00:00';
/*
* first set timezone as GMT.
* This is MUST because default timezone is differ from user timezone
*/
$gmt = new DateTimeZone('GMT');
$user_tz = 'America/Denver';
$st = new DateTime($row[`start_date`], $gmt);
// now set user timezone
$st->setTimezone($user_tz );
$stime = $qt->format('r');
echo $stime;
#$retrieve data from server in timestamp
$qry = "SELECT `start_date`,UNIX_TIMESTAMP(`start_date`) AS sTimestamp FROM..."
$st = new DateTime('@'.$row['sTimestamp ']);
$stime = $st->format('r');
echo $stime;
strtotime($row['start_date']) !== $row['sTimestamp']