gpt4 book ai didi

php - 如何处理服务器和客户端之间的时区?

转载 作者:可可西里 更新时间:2023-11-01 06:37:33 24 4
gpt4 key购买 nike

我正在开发一个网站,我必须在其中处理来自用户的不同可能时区。这成为一个大问题,因为网站会举办时间敏感的事件,例如拍卖。

服务器上的所有日期/时间均为 UTC。数据库以 UTC 时间戳存储所有内容。 PHP 默认时区也设置为 UTC (date_default_timezone_set('UTC');)。

现在,我的问题是我应该如何与用户交互,是只显示日期,还是更重要的是,我是从用户输入中读取日期/时间。

一个具体的例子:

  • 拍卖有截止日期,我将其作为 UTC 存储在数据库中。
  • 当我在网站上查看拍卖时,javascript 计时器使用 Date 对象来计算剩余时间。它会自动将时区转换为 GMT+0100(我本地的时区)。因此,如果截止日期是 '2013-08-08 10:46:08' (UTC),javascript 日期对象将返回 Aug 08 2013 11:26:15 GMT+0100 (GMT标准时间)
  • 如果当前时间大于 11:46:08,则计时器表示剩余时间为 00:00(这是正确的)。
  • 但是如果我尝试插入出价,服务器会接受,因为 MySQL INSERT 上的条件计算为 true:

    INSERT INTO Bids ... WHERE ... AND auction_deadline > NOW() ...

( 因为 auction_deadline = '2013-08-08 10:46:08' 和 NOW() = '2013-08-08 10:26:50' )

所有这些时区的庞然大物让我的大脑都融化了。我在这里错过了什么?我几乎可以肯定,将所有日期/时间以 UTC 格式存储在数据库中是最好的。我只是想不清楚如何在用户和数据库之间处理它。

最佳答案

您的问题根本不涉及时区,只是客户可以转动他们的时钟或让他们的时钟显着倾斜这一事实。为此,解决方法是每隔一段时间轮询一次服务器,以便在计算中使用偏移量修复。

事实上,您甚至不需要日期对象。拍卖结束时有一个普遍的瞬间。假设它是 1375960662823。现在,通用即时时间是 1375960669199,因此我们看到拍卖在 6 秒后结束(1375960662823 - 1375960669199 ~ 6000)。无论我在摩洛哥还是日本,它都会在 6 秒内结束。你明白了吗?

要生成这些数字,您可以在客户端调用 var now = Date.now() + skewFix,其中 skewFix 是需要应用的修正,以防万一客户有时间偏差或手动将他们的计算机设置为错误的时间。

在 PHP 中,您可以使用 $now = time() * 1000;

生成它

关于php - 如何处理服务器和客户端之间的时区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18124462/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com