带有php日期和时间戳的通知
我们有一个战斗系统,人们可以选择一个比赛时间来挑战另一个玩家。要创建匹配,用户需要选择一个日期。当前,用户从下拉列表中选择日期、小时、分钟和pm/am。如果用户选择2012年5月20日下午1点,系统将添加从一天开始的小时和分钟数。下面是一个快速示例,以更好地理解我所说的内容:带有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的值会发生变化。这很基本: 在人
$time = strtotime('today', $inputdate);
$time = $time + $hours + $minutes;
如果用户选择AM或PM,$hours
的值会发生变化。这很基本:
在人们开始出现时区问题之前,一切都很正常。例如,如果玩家A在下午1:00创建比赛,那么玩家B将看到比赛在下午1:00开始,但他/她将有不同的时区
问题是我不知道问题出在哪里:/
我不知道如何解决时区问题。我一直在创建函数,希望一切都能顺利完成,但运气不佳
我所拥有的:
- 用户配置文件具有时区选项李>
- 获取原始时间戳并根据用户时区返回格式化时间的函数
- 获取时间戳并将其转换为另一个时间戳的函数 基于用户的时区
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有限。我发布了一个新问题来缩小问题范围: