如果您关心保留所有数据,区域和位置就很重要。 (在我看来)存储日期的最佳方法是存储 UTC 时间戳 + 位置。
对于某些计算来说,仅偏移量可能就足够了,但如果您有时间戳,并且想知道“+1 天”之类的确切时间,则还不够。因为不同国家的情况各不相同,夏令时规则也不同。
因此,如果您想绝对确定自己不会“丢失信息”并且将来无法进行基于时间的计算,请存储 UTC 时间戳和 olson id(例如:欧洲/阿姆斯特丹)。
要回答你的第二个问题,如果你有这两条信息,你可以很容易地用 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.
Addition
我个人更喜欢将时间戳存储为整数。 TIMESTAMP 类型会自动转换,我觉得最好让 PHP 应用程序处理这个问题,这对于我认为您的用例(用户的简单本地化)特别有意义。
使用 DATETIME 也可以,但存储要求比仅使用整数高得多。如果您确实更喜欢 DATETIME,请尝试在应用程序中制定一条规则,将每个值始终存储为 UTC,因为永远不会出现任何混乱,尤其是与 DST 转换和当地时区法律变更相关的情况。
如果您只想在 Web 应用程序上显示根据用户本地时区计算的时间,则偏移量是无用的。对于大多数国家/地区来说,抵消额每年会发生两次变化,并且几乎每年都会有一两个国家/地区在发生这种情况时发生变化。
仅当您使用 PHP 出色的 DateTime 和 DateTimeZone 对象时才需要该位置。
最后一点建议:
人们往往会混淆 PHP 应用程序中的日期和时间,并以多种不同的格式(字符串、整数等)发送这些值,并混合使用 GMT 和 UTC。尝试为自己制定一条规则只曾经在函数参数和返回值中发送 DateTime 对象,这样您就可以输入提示,并且变量的格式永远不会有任何疑问。这是值得的。