javascript - 夏令时废除 - 我是否正确保存日期时间?

标签 javascript database database-design dst

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

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

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

最佳答案

一些事情:

  • MySQL 具有内置的日期和时间标准数据类型。它们是 DATEDATETIMETIMESTAMP。您可以阅读更多关于它们的信息 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/

相关文章:

javascript - 动态指定要在 Angular 指令中使用的 Controller

database - 如何在 H2 中创建过程

sql - 在此 SQL 模式中可以改进什么?

php - 如何在一行中显示汇总表和其他表数据?

sql-server - 如何创建需要两个外键之一的表?

javascript - Greasemonkey 脚本从 URL 中删除参数

javascript - 检测是否在子窗口中进行了点击

javascript - paper.js 中的动画颜色

mysql - 如何使用从数据库中排除的某些表进行 MySQL 转储

mysql - 如何结合 3 个表的结果来计算 MySql 中的平均分数?