首页 > 解决方案 > 取消夏令时 - 我是否正确保存日期时间?

问题描述

我目前正在开发一个 PHP/mySQL Web 应用程序,我们将日期存储为 UNSIGNED INT(10) 列中的 unix 时间戳。每当我们需要在 web 视图中显示日期时,我们都会获取该数字并使用 moment.js 对其进行解析。

虽然我的一位同事对这种解决任务的方式表示怀疑(他更喜欢将日期存储为“YYYY-MM-DD hh:mm:ss”VARCHARs),但到目前为止我们的问题为零。

我最近读到欧盟正在推进废除夏令时。根据我存储日期的特定方式,这会以任何方式影响我的 web 应用程序吗?

标签: javascriptdatabasedatabase-designdst

解决方案


一些东西:

  • MySQL 具有内置的日期和时间标准数据类型。它们DATEDATETIMETIMESTAMP您可以在此处的 MySQL 文档中阅读有关它们的更多信息。您应该从这些类型中选择一种,而不是存储整数或 varchars。

  • 这与 DST 的关系在很大程度上取决于上下文。没有一种正确的方法可以存储所有日期和时间。任何关于“始终存储在 UTC”的建议都是短视的,应该不鼓励。相反,请考虑日期和时间所代表的上下文。详细说明:

    • Unix 时间戳始终基于 UTC,因此与 DST 或时区的其他影响没有任何关系。当某事发生在现在或过去发生时,这是表示时间戳的好方法。在 MySQL 中,TIMESTAMP类型与这个概念非常吻合。

    • 如果您要存储未来某个事件的预定时间,则本地日期和时间在上下文中更为重要。在 MySQL 中,您可以将其存储在一个DATETIME类型中。如果您正在处理多个时区,那么您还需要该事件的时区标识符(例如America/New_York),您可以将其存储在VARCHAR. 在这种情况下,DST 非常依赖与该时区相关的基础规则。MySQL 具有CONVERT_TZ了解这些标识符的功能,并使用底层操作系统时区数据或其自己的时区表来了解 DST 是否有效。

    • 如果您使用的是完整日期,例如出生日期、周年日期、雇用日期或按给定工作日汇总数据,那么您需要将其保留为没有时间或时区的日期。这就像你在看纸质日历上的日期方块一样。MySQL 有这个DATE类型。在这种情况下,DST 不相关,除了确定某个时间点属于哪个日期。例如,当我们询问“今天”是哪一天时,我们也在考虑时间和时区,包括 DST——但是一旦我们声明“2019 年 4 月 4 日”,那么所有这些信息都会被删除。

  • 您问题的最后一部分涉及如何实施基础时区数据,以及在欧盟废除 DST 的情况下如何更新数据。为此,我将向您推荐这个答案,它解释了 IANA 时区数据库并直接解决了当前的欧盟问题。


推荐阅读