gpt4 book ai didi

php - 在 PHP 和 MySQL 中使用时区

转载 作者:行者123 更新时间:2023-11-29 02:05:20 25 4
gpt4 key购买 nike

我应该如何处理时区。只为用户存储偏移量是否安全?或者我还应该有区域/位置吗?当我比较维基百科和 PHP 中的偏移值时,有些不匹配。我应该相信哪个?

最后,我应该如何在 PHP 中使用它。我可以只执行“时间 - 服务器偏移量 + 用户偏移量”吗?

最佳答案

如果您关心保留所有数据,那么区域和位置很重要。存储日期的最佳方式(在我看来)是存储 UTC 时间戳 + 位置。

对于某些计算,仅偏移量可能就足够了,但如果您有时间戳,并且想知道诸如“+1 天”之类的确切时间,这就不够了。因为这在不同的国家/地区有不同的夏令时规则。

因此,如果您想绝对确定您不会“丢失信息”并且将来无法进行基于时间的计算,请存储 UTC 时间戳和 olson id(例如:Europe/Amsterdam)。

回答你的第二个问题,如果你有这两条信息,你可以很容易地用DateTime重构它:

$dt = new DateTime('@' . $timeStamp);
// Now convert it to the users timezone
$dt->setTimeZone(new DateTimeZone('Europe/Berlin'));

// Now you have a 'DateTime' object which you can easily display with the ->format function.

添加

我个人更喜欢将时间戳存储为整数。 TIMESTAMP 类型会自动转换,我觉得让 PHP 应用程序处理这个更好,这对于我认为您的用例(用户的简单本地化)特别有意义。

使用 DATETIME 也可以,但存储要求比仅使用整数要高得多。如果您确实更喜欢 DATETIME,请尝试在您的应用程序中制定一条规则,始终将每个值存储为 UTC,因为永远不会有任何混淆,尤其是在与 DST 转换和您本地时区的法律变更相关的情况下。

如果您只想在您的 Web 应用程序上显示根据用户本地时区计算的时间,则偏移量是无用的。大多数国家/地区的偏移量每年更改两次,几乎每年都会有一个或两个国家/地区发生这种情况。

只有在使用 PHP 出色的 DateTime 和 DateTimeZone 对象时才需要位置。

最后一点建议:

人们往往会混淆 PHP 应用程序中的日期和时间,并以许多不同的格式(字符串、整数等)发送这些值,并混合使用 GMT 和 UTC。尝试为自己制定一个规则,永远在函数参数和返回值中发送 DateTime 对象,这样您就可以进行类型提示,并且永远不会怀疑变量的格式。它将是值得。

关于php - 在 PHP 和 MySQL 中使用时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7238504/

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