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

问题描述 投票:0回答:2

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

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

我最近读到欧洲联盟正在推进废除夏令时。这将根据我存储日期的特定方式以任何方式影响我的webapp吗?

javascript database database-design dst
2个回答
0
投票

我会出来说不,不应该没关系。我不是专家,但我也将日期存储为UNIX时间戳,如果您生成的10位数时间戳类似于:

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

(或任何依赖Date.prototype.getTime()的东西),然后你存储一个不关心时区的通用日期,这很好,因为如果用户从不同的时区登录,你就不会返回基于它们所在的varchars以前是。这同样适用于夏令时更改时区中的时钟(或在取消后不能这样做)。

为了获得用户当前位置的正确的人类可读字符串,Javascript依赖于timezoneOffset,它不是日期对象的一部分,而是回答“这个浏览器现在离伦敦多少个时区?”的问题。 (除非是几分钟而不是几小时,并且在考虑夏令时之后。)据推测,用户的设备将会知道更改,浏览器也会知道,并且您的脚本将能够相应地执行操作。 (如果他们的设备使用了错误的时区,那么您的应用程序将不会是唯一一个行为不端的应用程序,直到他们将其整理出来。)

正如我所说的那样,我不是这方面的专家,所以我有可能让自己确信Javascript处理日期的方式并不正确,但就我目前的理解而言,我认为你的解决方案应该是没事的。我希望如果我弄错了,其他一些书呆子会立刻响起,让我们都知道。


0
投票

一些东西:

  • MySQL具有内置日期和时间的标准数据类型。他们是DATEDATETIMETIMESTAMP。你可以读更多关于他们in the MySQL documentation here。您应该从这些类型中选择一种而不是存储整数或变量。
  • 这与DST的关系非常依赖于背景。没有一种正确的方法来存储所有日期和时间。任何“始终以UTC存储”的建议都是短视的,应该不鼓励。相反,请考虑日期和时间所代表的背景。详细说明: Unix时间戳始终基于UTC,因此与DST或其他时区效果无关。这是表示当前事件发生或过去发生的时间戳的好方法。在MySQL中,TIMESTAMP类型与此概念很好地对齐。 如果您将来存储事件的预定时间,则本地日期和时间在上下文中更为重要。在MySQL中,您可以将其存储在DATETIME类型中。如果您正在处理多个时区,那么您还需要该事件的时区标识符(例如America/New_York),您可以将其存储在VARCHAR中。在这种情况下,DST非常依赖于与该时区相关联的基础规则。 MySQL具有CONVERT_TZ等功能,可以理解这些标识符,并使用底层操作系统时区数据或自己的时区表来了解DST是否生效。 如果您正在处理整个日期,例如出生日期,周年纪念日,雇用日期或在给定工作日汇总数据,那么您需要将其保留为没有时间或时区的日期。就像你在纸质日历上查看日期方块一样。 MySQL有DATE类型。除了确定某个时间点属于哪个日期之外,DST在这种情况下不相关。例如,当我们询问“今天”的哪一天时,我们也在考虑包括夏令时的时间和时区 - 但是一旦我们说“2019年4月4日”,那么所有这些信息都将被删除。
  • 问题的最后一部分涉及基础时区数据的实施方式,以及在欧盟废除夏令时期间如何更新。为此,我将向您推荐this answer,它解释了IANA时区数据库,并直接解决了当前欧盟关注的问题。
© www.soinside.com 2019 - 2024. All rights reserved.