我们有一个战斗系统,人们可以选择一个匹配时间来挑战另一个玩家。要创建匹配项,用户需要选择日期。目前,用户从下拉列表中选择日,小时,分钟和下午/上午。如果用户选择5/20/2012 @ 1PM,系统将从当天开始添加小时和分钟。这是一个快速的示例,可以更好地理解我在说什么:
$time = strtotime('today', $inputdate);
$time = $time + $hours + $minutes;
如果用户选择AM或PM,则$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;
}
}
答案 0 :(得分:0)
基本上,数据库中的所有内容都应使用单个时区存储,最好是不受DST影响的时区。这里的标准选项是UTC。
如果您按名称了解用户的时区,则可以使用该时区来生成时间:
// Player A creates match at 1PM Europe/London
$timezone = 'Europe/London';
$localTime = '2012-03-01 13:00:00';
// work out UNIX timestamp using that timezone (making it timezone independent)
date_default_timezone_set($timezone);
$timestamp = strtotime($localTime);
// store $timestamp in the database
// Player B views the timestamp with timezone America/Los_Angeles
$timezone = 'America/Los_Angeles';
date_default_timezone_set($timezone);
var_dump(date('c', $timestamp)); // see manual for more output formats
如果您将时区存储为缩写(例如“CET”,“GMT”),则使用timezone_name_from_abbr
获取正确的时区名称。