带有php日期和时间戳的通知

带有php日期和时间戳的通知,php,date,time,timestamp,Php,Date,Time,Timestamp,我们有一个战斗系统,人们可以选择一个比赛时间来挑战另一个玩家。要创建匹配,用户需要选择一个日期。当前,用户从下拉列表中选择日期、小时、分钟和pm/am。如果用户选择2012年5月20日下午1点,系统将添加从一天开始的小时和分钟数。下面是一个快速示例,以更好地理解我所说的内容: $time = strtotime('today', $inputdate); $time = $time + $hours + $minutes; 如果用户选择AM或PM,$hours的值会发生变化。这很基本: 在人

我们有一个战斗系统,人们可以选择一个比赛时间来挑战另一个玩家。要创建匹配,用户需要选择一个日期。当前,用户从下拉列表中选择日期、小时、分钟和pm/am。如果用户选择2012年5月20日下午1点,系统将添加从一天开始的小时和分钟数。下面是一个快速示例,以更好地理解我所说的内容:

$time = strtotime('today', $inputdate);
$time = $time + $hours + $minutes;
如果用户选择AM或PM,
$hours
的值会发生变化。这很基本:

在人们开始出现时区问题之前,一切都很正常。例如,如果玩家A在下午1:00创建比赛,那么玩家B将看到比赛在下午1:00开始,但他/她将有不同的时区

问题是我不知道问题出在哪里:/

我不知道如何解决时区问题。我一直在创建函数,希望一切都能顺利完成,但运气不佳

我所拥有的:

  • 用户配置文件具有时区选项
  • 获取原始时间戳并根据用户时区返回格式化时间的函数
  • 获取时间戳并将其转换为另一个时间戳的函数 基于用户的时区
我迷路了,我似乎无法解决这个问题,我可以编写代码,但现在我的想法不合逻辑。我花了一个小时来写这篇文章,并试图解释我是如何做到的,因为我自己也不知道如何让它发挥作用。一些建议是非常感谢的

我需要一个将时间戳转换为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;
    }
}

基本上,数据库中的所有内容都应该使用单个时区存储,最好是不受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”),则使用“\u abbr”中的“
timezone\u name\u”获取正确的时区名称。

将所有数据存储在一致的时区中(UTC应该是要选择的时区)。然后,只在向用户显示时区时进行计算。如果我将其存储为另一个时区,会有什么不同吗?不会,但这可能会让你慢慢发疯:-)如果存储UNIX时间戳(即strotime的结果),那么存储时就没有时区信息。我不明白这段代码。我只通过偏移量知道用户的时区,比如:如果用户在洛杉矶,偏移量/时区将是-8(系统就是这样设置的)。应该不太难处理,但并不总是完美的(例如,他们是UTC-8,因为他们在洛杉矶,还是在夏令时在阿拉斯加?)查看有关从UTC偏移量获取时区名称的最佳方法的信息。系统也有用户的DST,因此这不是问题所在。我现在知道了问题所在,问题是我需要将时间戳转换为UTC-5(服务器时间)。我不知道怎么做…我更新了我的Q,希望你能帮我一点忙。好的,这样你就可以知道时区名称了。然后使用如上设置的日期\默认\时区\对任何日期进行格式化/解析。请参阅上面的示例。我无法使用您的方法,因为我使用vbulletin,并且它们的API有限。我发布了一个新问题来缩小问题范围: