我目前正在开发一个PHP / mySQL Web应用程序,我们将日期存储为UNSIGNED INT(10)列中的unix时间戳。每当我们需要在Web视图中显示日期时,我们会使用该数字并使用moment.js对其进行解析。
虽然我的一位同事怀疑这种解决任务的方式(他更喜欢将日期存储为“YYYY-MM-DD hh:mm:ss”VARCHAR),但到目前为止我们没有问题。
我最近读到欧洲联盟正在推进废除夏令时。这将根据我存储日期的特定方式以任何方式影响我的webapp吗?
我会出来说不,不应该没关系。我不是专家,但我也将日期存储为UNIX时间戳,如果您生成的10位数时间戳类似于:
getSecondsSinceEpoch = ((date) => Math.floor(date.getTime()/1000));
(或任何依赖Date.prototype.getTime()的东西),然后你存储一个不关心时区的通用日期,这很好,因为如果用户从不同的时区登录,你就不会返回基于它们所在的varchars以前是。这同样适用于夏令时更改时区中的时钟(或在取消后不能这样做)。
为了获得用户当前位置的正确的人类可读字符串,Javascript依赖于timezoneOffset,它不是日期对象的一部分,而是回答“这个浏览器现在离伦敦多少个时区?”的问题。 (除非是几分钟而不是几小时,并且在考虑夏令时之后。)据推测,用户的设备将会知道更改,浏览器也会知道,并且您的脚本将能够相应地执行操作。 (如果他们的设备使用了错误的时区,那么您的应用程序将不会是唯一一个行为不端的应用程序,直到他们将其整理出来。)
正如我所说的那样,我不是这方面的专家,所以我有可能让自己确信Javascript处理日期的方式并不正确,但就我目前的理解而言,我认为你的解决方案应该是没事的。我希望如果我弄错了,其他一些书呆子会立刻响起,让我们都知道。
一些东西:
DATE
,DATETIME
和TIMESTAMP
。你可以读更多关于他们in the MySQL documentation here。您应该从这些类型中选择一种而不是存储整数或变量。TIMESTAMP
类型与此概念很好地对齐。
如果您将来存储事件的预定时间,则本地日期和时间在上下文中更为重要。在MySQL中,您可以将其存储在DATETIME
类型中。如果您正在处理多个时区,那么您还需要该事件的时区标识符(例如America/New_York
),您可以将其存储在VARCHAR
中。在这种情况下,DST非常依赖于与该时区相关联的基础规则。 MySQL具有CONVERT_TZ
等功能,可以理解这些标识符,并使用底层操作系统时区数据或自己的时区表来了解DST是否生效。
如果您正在处理整个日期,例如出生日期,周年纪念日,雇用日期或在给定工作日汇总数据,那么您需要将其保留为没有时间或时区的日期。就像你在纸质日历上查看日期方块一样。 MySQL有DATE
类型。除了确定某个时间点属于哪个日期之外,DST在这种情况下不相关。例如,当我们询问“今天”的哪一天时,我们也在考虑包括夏令时的时间和时区 - 但是一旦我们说“2019年4月4日”,那么所有这些信息都将被删除。