Php 如何处理服务器和客户端之间的时区?
我正在开发一个网站,在那里我必须处理来自用户的不同时区。这成为一个很大的问题,因为该网站主办的时间微妙的活动,如拍卖 服务器上的所有日期/时间均以UTC为单位。数据库以UTC时间戳存储所有内容。PHP默认时区也设置为UTC(Php 如何处理服务器和客户端之间的时区?,php,javascript,mysql,timezone,client-side,Php,Javascript,Mysql,Timezone,Client Side,我正在开发一个网站,在那里我必须处理来自用户的不同时区。这成为一个很大的问题,因为该网站主办的时间微妙的活动,如拍卖 服务器上的所有日期/时间均以UTC为单位。数据库以UTC时间戳存储所有内容。PHP默认时区也设置为UTC(date\u default\u timezone\u set('UTC');) 现在,我的问题是我应该如何和用户交互,无论我是只显示一个日期,还是更重要的是,我从用户输入中读取一个日期/时间 一个具体的例子: 拍卖有一个截止日期,我将其作为UTC存储在数据库中 当我在网站
date\u default\u timezone\u set('UTC');
)
现在,我的问题是我应该如何和用户交互,无论我是只显示一个日期,还是更重要的是,我从用户输入中读取一个日期/时间
一个具体的例子:
- 拍卖有一个截止日期,我将其作为UTC存储在数据库中
- 当我在网站上查看拍卖时,javascript计时器使用
对象来计算剩余时间。它会自动将时区转换为GMT+0100(我的本地时区)。因此,如果截止日期是Date
(UTC),javascript日期对象将返回'2013-08-08 10:46:08'
2013年8月8日11:26:15 GMT+0100(GMT标准时间)
- 如果当前时间大于11:46:08,则计时器显示剩余时间为00:00(这是正确的)
- 但是如果我尝试插入出价,服务器会接受,因为
上的条件计算为MySQL insert
: 在投标书中插入。。。哪里拍卖截止日期>现在()true
所有这些乱七八糟的时区让我的大脑都融化了。我错过了什么?我几乎可以肯定,在数据库中以UTC格式存储所有日期/时间是最好的。我只是想不清楚如何在用户和数据库之间处理它。你可以做以下事情 加载页面后,向服务器发送一个带有用户时区偏移量的ajax请求。您可以使用以下代码获取时区偏移
var curdate = new Date()
var offset = curdate.getTimezoneOffset()
偏移量是以分钟为单位的时区偏移量
我想这会有帮助。这是一个典型的主题,但对大多数人来说非常复杂。首先,你从来没提过夏令时。是的,我在增加你的紧张:) 现在让我们看看我们如何做到这一点。您在UTC中节省了时间,做得很好。现在,我希望您已经注册了成员,并且每个成员都能够设置其首选时区,否则您将向他们显示服务器基于时区的时间 当您通过“开始时间”发送给用户时,您必须在将UTC时间转换为其时间后将其发送给用户,同样,当您从浏览器接受时间时,无论是用户操作还是javascript,您需要将该时间转换为UTC,考虑到用户是为其配置文件选择的时区这一事实 希望你能弄清楚自己哪里出了问题?请通读日光节约,因为当你们在同一条道路上继续其他逻辑时,它也将发挥重要作用 编辑:
您可以使用javascript的时区偏移,根据其设置自动提交和用户输入。每次从客户端获取日期时,您都可以使用getUTC转换为UTC日期,即:
var todayDate = new Date();
var todayDateInUTC = new Date(todayDate.getUTCFullYear(), todayDate.getUTCMonth(), todayDate.getUTCDate(), todayDate.getUTCHours(), todayDate.getUTCMinutes(), todayDate.getUTCSeconds());
因此,在将投标日期插入数据库之前,请使用getUTC函数将其转换为UTC格式。您的问题根本不涉及时区,只是客户可能会改变时钟或使其时钟发生明显的偏移。为此,修复程序是每隔一段时间轮询服务器一次,以便在计算中使用偏移量修复程序 事实上,您甚至不需要日期对象。拍卖结束时,有一个普遍的时刻。假设它是
1375960662823
。现在,通用的即时时间是1375960669199
,因此我们可以看到拍卖在6秒内结束(1375960662823-1375960669199~6000
)。无论我是在摩洛哥还是在日本,比赛都将在6秒后结束。你明白了吗
要生成这些数字,您可以在客户端调用var now=Date.now()+skewFix
,其中skewFix
是在客户端出现时间偏移或手动将其计算机设置为错误时间时需要应用的更正
在PHP中,您可以使用
$now=time()*1000代码>JavaScript中的日期使用本地时区。您应该为用户获取UTC时间并将其发送到服务器
new Date
Thu Aug 08 2013 17:00:14 GMT+0530 (India Standard Time)
(new Date("Thu Aug 08 2013 17:00:14")).toUTCString();
"Thu, 08 Aug 2013 11:30:14 GMT"
这将解决服务器和客户端之间的时区问题。您说过
(因为拍卖截止日期为'2013-08-08 10:46:08'而现在为'2013-08-08 10:26:50')
在MySQL中-NOW
返回服务器本地时区中的当前时间
您可能需要类似于UTC\u TIMESTAMP
的东西,它以UTC为单位返回当前时间
此外,您可能根本不应该接受来自客户端JavaScript的任何输入时间。只相信你自己的时钟。出价时,使用MySQL或PHP中服务器上的时间。不要接受它作为输入。如果您需要一些代码来澄清我的问题,请说出来。