我目前正在开发一个 PHP/mySQL 网络应用程序,我们将日期作为 unix 时间戳存储在 UNSIGNED INT(10) 列中。每当我们需要在 Web View 中显示日期时,我们都会获取该数字并使用 moment.js 对其进行解析。
虽然我的一位同事对这种解决任务的方式表示怀疑(他更喜欢将日期存储为“YYYY-MM-DD hh:mm:ss”VARCHAR),但到目前为止我们的问题为零。
我最近读到欧盟正在推进废除夏令时。根据我存储日期的特定方式,这会以任何方式影响我的网络应用程序吗?
最佳答案
一些事情:
MySQL 具有内置的日期和时间标准数据类型。它们是
DATE
、DATETIME
和TIMESTAMP
。您可以阅读更多关于它们的信息 in the MySQL documentation here .您应该从这些类型中选择一种,而不是存储整数或 varchar。这与 DST 的关系在很大程度上取决于上下文。没有一种正确的方法可以存储所有日期和时间。任何关于“始终存储在 UTC 中”的建议都是短视的,应该被劝阻。相反,请考虑日期和时间所代表的上下文。详细说明:
Unix 时间戳始终基于 UTC,因此与 DST 或时区的其他影响没有任何关系。当某事发生在现在或过去发生时,这是表示时间戳的好方法。在 MySQL 中,
TIMESTAMP
类型非常符合这个概念。如果您要存储 future 事件的预定时间,则本地日期和时间在上下文中更为重要。在 MySQL 中,您会将其存储在
DATETIME
类型中。如果您要处理多个时区,那么您还需要该事件的时区标识符(例如America/New_York
),您可以将其存储在VARCHAR
中.在这种情况下,DST 非常依赖于与该时区关联的基本规则。 MySQL 具有CONVERT_TZ
等函数,可以理解这些标识符并使用底层操作系统时区数据或它自己的时区表来了解 DST 是否有效。如果您要处理整个日期,例如出生日期、周年纪念日期、雇用日期或按给定工作日汇总数据,则需要将其保留为没有时间或时区的日期。这就像您在纸质日历上查看日期方 block 一样。 MySQL 对此有
DATE
类型。 DST 在这种情况下不相关,除了确定某个时间点属于哪个日期。例如,当我们询问“今天”是哪一天时,我们也会考虑包括夏令时在内的时间和时区 - 但一旦我们说“2019 年 4 月 4 日”,所有这些信息都会被删除。
问题的最后一部分涉及基础时区数据的实现方式,以及在欧盟废除夏令时时如何更新这些数据。为此,我会向您推荐 this answer ,它解释了 IANA 时区数据库并直接解决了当前欧盟关注的问题。
关于javascript - 夏令时废除 - 我是否正确保存日期时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55456447/