【问题标题】:advice with php date and timestampsphp日期和时间戳的建议
【发布时间】: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 的结果),那么你在存储时没有时区信息。

标签: php date time timestamp


【解决方案1】:

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

【讨论】:

  • 我没有收到此代码。我只通过偏移量知道用户的时区,例如:如果用户在洛杉矶,则偏移量/时区将为 -8(这就是系统的设置方式)。
  • 应该不会太难处理,但它并不总是完美的(即它们是 UTC -8,因为它们在洛杉矶,还是在夏令时期间在阿拉斯加?)查看this question 以获取有关从 UTC 偏移量获取时区名称的最佳方法的信息。
  • 系统也有用户的夏令时,所以这不是问题。我现在知道问题所在,问题是我需要将时间戳转换为 UTC -5(服务器时间)。我不知道该怎么做...我更新了我的 Q 希望你能帮上忙。
  • OK,这样你就可以知道时区名称了。然后如上所述使用 date_default_timezone_set ,使用该时区格式化/解析任何日期。有关上述示例,请参阅codepad.org/DVFrKgFk
  • 我不能使用你的方法,因为我使用 vbulletin 并且他们的 API 是有限的。我发布了一个新问题来缩小问题范围:stackoverflow.com/questions/9526939/…
猜你喜欢
  • 2013-06-16
  • 2016-04-05
  • 1970-01-01
  • 2015-03-10
  • 2011-08-07
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多