【发布时间】:2012-03-20 13:22:37
【问题描述】:
我们有一个战斗系统,人们可以选择比赛时间来挑战其他玩家。要创建匹配,用户需要选择一个日期。当前,用户从下拉列表中选择日期、小时、分钟和下午/上午。如果用户选择 2012 年 5 月 20 日@下午 1 点,系统会添加从一天开始的小时和分钟。下面是一个快速示例,可以更好地理解我在说什么:
$time = strtotime('today', $inputdate);
$time = $time + $hours + $minutes;
如果用户选择上午或下午,$hours 的值会发生变化。这是非常基本的:
在人们开始遇到时区问题之前,一切正常。例如,如果玩家 A 在下午 1 点创建比赛,那么玩家 B 将看到比赛在下午 1 点开始,但他/她将有不同的时区!
问题是我不知道问题所在:/
我不知道如何解决时区问题。我一直在创建函数,希望所有东西都能融合在一起,但没有运气。
我有什么:
- 用户配置文件有一个时区选项。
- 获取原始时间戳并根据用户的时区返回格式化时间的函数。
- 获取时间戳并将其转换为另一个时间戳的函数 基于用户的时区。
我迷路了,我似乎无法解决问题,我可以编码,但现在我的思维不合逻辑。我花了一个小时来写这篇文章,并试图解释它是如何做到的,因为我自己不知道如何让它发挥作用。一些建议表示赞赏。
我需要一个函数将时间戳转换为 UTC-5:
function input_date($timestamp)
{
global $vbulletin;
$timestamp = (int)$timestamp;
if (strlen((string)$timestamp) == 10)
{
$hour = 3600.00;
$offset = $vbulletin->userinfo['timezoneoffset'];//sample -8
$ds = (int)$vbulletin->userinfo['dstonoff'];//DST
$fluff = $hour*($offset+5.00);
$timestamp = $timestamp+$fluff+($ds*$hour);
return $timestamp;//return timestamp in UTC-5 format..
}
else
{
return 0;
}
}
【问题讨论】:
-
将所有数据存储在一致的时区中(UTC 应该是首选)。然后,仅在向用户显示时区时进行计算。
-
如果我将它存储为另一个时区会有所不同吗?
-
不,但它可能会让你慢慢发疯 :-) 如果你存储 UNIX 时间戳(即 strtotime 的结果),那么你在存储时没有时区信息。