【发布时间】:2012-06-21 11:44:46
【问题描述】:
我正在向我的系统添加基于拍卖的数据。例如:
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
我将所有这些信息按原样存储在我的数据库中(即所有存储时间都基于用户的时区)。
现在我想要结束时间和当前时间之间的实际差异(美国/丹佛时区)。
我使用了DateTime() 函数
所以即使我不转换时区;它返回相同的差异(这也是错误的)。
我的 PHP 代码如下;你也可以在CodePad找到它
$end_time = 'Fri, 22 Jun 2012 03:46:22 AM';
$tz = 'America/Denver';
dateDifference($end_time,$tz);
function dateDifference($end, $tz = NULL)
{
$owner_tz = new DateTimeZone($tz);
//var_dump($owner_tz->getName());
$from = new DateTime("now", new DateTimeZone('GMT'));
$from ->setTimeZone($owner_tz);
$to = new DateTime($end,new DateTimeZone('GMT'));
/* @Note:I have commented below setTimeZone() because I have already stored
* `end time` as per user's timezone, So I dont need to convert it again
* into user's timezone.you can un-comment below line.
* it doesn't affect the results anyways.
*/
//$to ->setTimeZone($owner_tz);
//procedural style using date_diff()
$interval = date_diff($from, $to);
var_dump($interval);
// OO style using dateTime::diff()
$interval = $from->diff($to);
var_dump($interval);
}
返回:
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
参考资料:
【问题讨论】:
-
根据用户的时区存储日期/时间信息是一种非常糟糕的做法,如果用户更改了他/她的时区怎么办?一个好的做法是在没有时区的情况下存储所有日期/时间信息(如 UTC 时间戳),这样您可以最大限度地减少转换和计算操作的数量,因此您只需担心在输出日期/时间时设置正确的时区用户。
-
我的列数据类型是
datetime,所以当我存储时我需要做些什么更改,因为日期时间的发布数据作为用户的时区来 -
我并不是说您需要更改您的应用程序,这只是一个建议。您是否将 date_default_timezone_set 放在某个地方以确保您的服务器时间正确?
-
是的,我已经在我的配置文件中设置了它。但你的想法真的很好。我之前曾有过这种想法
-
但是这里的重点是为什么
date_diff显示错误的结果??