取消夏令时-我是否正确保存日期时间?

时间:2019-04-01 13:34:26

标签: javascript database database-design dst

我目前正在使用PHP / mySQL Web应用程序,在此应用程序中,日期以unix时间戳记存储在UNSIGNED INT(10)列中。每当我们需要在网络视图中显示日期时,我们都会使用该数字并将其与moment.js进行解析。

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

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

2 个答案:

答案 0 :(得分:0)

我要出来说不,没关系。我不是专家,但是我也将日期存储为UNIX时间戳,如果要生成10位时间戳,则如下所示:

getSecondsSinceEpoch = ((date) => Math.floor(date.getTime()/1000));

(或任何依赖Date.prototype.getTime()的内容),那么您存储的是一个通用日期,它不关心时区,这很好,因为如果用户从其他时区登录,则不会返回基于以前的位置的varchars。当夏时制更改其时区中的时钟(或在废除后未能更改时)时,也是如此。

要获取用户当前位置的正确的人类可读字符串,Javascript依赖于timezoneOffset,它不是日期对象的一部分,而是回答了以下问题:“此浏览器离伦敦有几个时区马上?” (除了以分钟而不是小时为单位,并考虑了夏时制。)大概,用户的设备以及浏览器将已经知道该更改,并且您的脚本将能够相应地采取行动。 (如果他们的设备使用了错误的时区,那么直到他们将其整理出来后,您的应用程序才会是唯一行为异常的应用程序。)

正如我所说,我不是这方面的专家,所以我可能已经说服自己关于Javascript处理日期的方式不正确,但就我目前的理解而言,我认为您的解决方案应该可以。我希望如果我弄错了,其他一些书呆子会立刻发出警报,让我们俩都知道。

答案 1 :(得分:0)

几件事:

  • MySQL具有针对日期和时间内置的标准数据类型。它们是DATEDATETIMETIMESTAMP。您可以进一步了解它们in the MySQL documentation here。您应该从这些类型中选择一种,而不是存储整数或varchars。

  • 这与DST的关系在很大程度上取决于上下文。没有一种正确的方法来存储所有日期和时间。关于“始终存储在UTC中”的任何建议都已被简化,不建议使用。相反,请考虑日期和时间表示的上下文。详细说明:

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

    • 如果要在将来存储事件的计划时间,则 local 日期和时间在上下文上要重要得多。在MySQL中,您可以将其存储为DATETIME类型。如果要处理多个时区,则还需要该事件的时区标识符(例如America/New_York),可以将其存储在VARCHAR中。在这种情况下,DST非常依赖与该时区关联的基本规则。 MySQL具有CONVERT_TZ之类的函数,可以理解这些标识符,并使用基础的OS时区数据或它自己的时区表来了解DST是否有效。

    • 如果要处理整个日期,例如出生日期,周年纪念日,雇用日期或在给定工作日之前汇总数据,则需要将该日期保留为没有时间或时区的日期。就像您在看纸质日历上的日期方块一样。 MySQL为此具有DATE类型。在这种情况下,DST与确定时间点所属的日期无关。例如,当我们问“今天”是星期几时,我们也在考虑包括夏令时在内的时间和时区-但是一旦声明“ 2019年4月4日”,所有这些信息都将被删除。

  • 您的问题的最后一部分涉及如何实施基础时区数据,以及在欧盟废除DST的情况下如何对其进行更新。为此,我将带您参考this answer,它解释了IANA时区数据库,并直接解决了当前的欧盟问题。