关于处理日期有很多建议。我想澄清一下。假设:
用户正在将记录插入数据库
为该记录生成插入日期的Unix时间戳
现在,用户希望查询数据库中的日期间隔:
用户在其本地时区中提供2个日期
使用这些值将时区转换为UTC并获取时间戳
根据转换后的2个整数查询数据库中的记录(例如,其中日期大于等于第一个,日期小于等于第二个)
再次将检索到的时间戳转换为本地时区进行显示
我知道这在PHP中是可能的,但在本例中不需要关心MySQL的时区设置——只有PHP。系统将是64位的,因此存储日期的空间不足不是问题。但是…
这是否会引发其他严重问题,如DST变更或其他问题?
什么让你怀疑这些问题?因为您不确定MySQL如何处理这些时间戳,例如数据库中的那些时间戳属于哪个时区?您是将日期存储为Unix时间戳还是如何存储它们?
我天生多疑。因为我不知道日期和时间处理的一切,所以我很自然地去寻找答案,以确保一切都正常。不,我将Unix时间戳存储为大整数而不是时间戳字段。我不想让MySQL知道我们在处理日期问题。
然后看看@tadeck的答案。
别介意-记住,必须使用基于MySQL的日期函数,所以我必须将时间戳存储为时间戳。
Unix时间戳与时区无关。
这也是您可以更改此步骤的原因:
use these values to convert timezone to UTC and get the timestamp
号
在这方面:
convert values to Unix timestamp
号
尽管在数据库(如mysql)中存储时间戳非常简单。如果要执行以下操作,可以确保php具有unix时间戳:
使用FROM_UNIXTIME()mysql函数保存值(给unix timestamp作为参数,根据mysql的设置接收datetime)。
使用UNIX_TIMESTAMP()mysql函数(给出字段名或参数值)检索值,根据mysql的设置,根据数据库中存储的日期时间获取unix时间戳(integer)。
只需记住使用TIMESTAMP列类型来存储时间戳。这样,时间将以独立于时区的方式存储,仅根据MySQL的设置显示。
关于mysql的版本你是对的,但是…我希望能够独立于MySQL进行操作。在您的情况下,我是否能够独立于MySQL的时区设置安全地工作?
@马吕斯:我只是说,TIMESTAMP与包含unix时间戳的INT非常相似,不存在时区问题。请参阅偶比较(这实际上是整个新讨论的主题):stackoverflow.com/a/7029306/548696和stackoverflow.com/a/331655/548696。当涉及到独立于mysql做事情时,那么一些抽象层可能包括php和mysql之间的转换(比如在不同的表单中),你不会完全隐藏在mysql中。使用TIMESTAMP还可以使用与日期时间相关的函数、分组等。
谢谢你的解释。我想我可以不使用MySQL。那是…直到你提醒我分组的时候:)我想我必须存储时间戳。
t检查Unix时间戳是否与时区无关是正确的。
但是,在整个应用程序中使用时间戳时,您应该将数据库中的时间戳作为纯整数存储和使用。在应用程序级别(在PHP中)转换为本地时区或从本地时区转换。这允许您只关注PHP中的时区,而不关注2个系统中的时区。它还简化了在应用程序级别为单个用户设置时区的过程。
谢谢,但重点是当使用TIMESTAMP列时,日期时间也以时区独立格式存储,这不会以任何方式限制您允许用户以自己的方式设置时区。mysql的TIMESTAMP列专门为存储时间戳而设计。虽然对存储时间戳有两种不同的看法:一种认为应该使用INT,另一种认为应该使用TIMESTAMP(认为应该使用DATETIME当然是不正确的;)。
我很欣赏这种观点,但时间戳只是个提示。所以当在SQL中进行比较时,int是可以的。我喜欢在应用程序级别执行的任何本地转换。这样MySQL的时区设置就不相关了。
不过,我确实把它们存得很大。
@马茨:我理解这些论点。我还喜欢将时间戳存储为INTs,直到我真正了解到在某个时候我通常需要在数据库层上解释时间戳(例如,我需要使用一个与日期时间相关的SQL函数),然后我真的需要TIMESTAMP而不是整数。