有关php日期和时间戳的建议

时间:2012-03-02 00:51:39

标签: php date time timestamp

我们有一个战斗系统,人们可以选择一个匹配时间来挑战另一个玩家。要创建匹配项,用户需要选择日期。目前,用户从下拉列表中选择日,小时,分钟和下午/上午。如果用户选择5/20/2012 @ 1PM,系统将从当天开始添加小时和分钟。这是一个快速的示例,可以更好地理解我在说什么:

$time = strtotime('today', $inputdate);
$time = $time + $hours + $minutes;

如果用户选择AM或PM,则$hours的值会更改。这很基本: sample

一切正常,直到人们开始有时区问题。例如,如果玩家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;
    }
}

1 个答案:

答案 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获取正确的时区名称。