javascript - 取消夏令时 - 我是否正确保存日期时间?
问题描述
我目前正在开发一个 PHP/mySQL Web 应用程序,我们将日期存储为 UNSIGNED INT(10) 列中的 unix 时间戳。每当我们需要在 web 视图中显示日期时,我们都会获取该数字并使用 moment.js 对其进行解析。
虽然我的一位同事对这种解决任务的方式表示怀疑(他更喜欢将日期存储为“YYYY-MM-DD hh:mm:ss”VARCHARs),但到目前为止我们的问题为零。
我最近读到欧盟正在推进废除夏令时。根据我存储日期的特定方式,这会以任何方式影响我的 web 应用程序吗?
解决方案
一些东西:
MySQL 具有内置的日期和时间标准数据类型。它们
DATE
是DATETIME
和TIMESTAMP
。您可以在此处的 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 时区数据库并直接解决了当前的欧盟问题。
推荐阅读
- laravel - 如何查看 Laravel Livewire 的版本
- postgresql - 在 Allure TestOps 中清理数据
- python - 将 tkinter 画布旋转特定角度
- reactjs - 如何使用更改的 HOST 文件打开远程反应应用程序?
- json - 如何将导入的 json 表格视图保存到 json 文件中
- javascript - 放大可见时间轴时缺少结束日期的项目
- javascript - 是否可以在我的网站上显示 .asf 视频格式?
- android - 手机未收到 Wear OS 发送的消息
- php - "?" 和有什么不一样 和 PHP 函数参数中的“= null”
- java - java在处理ArrayLists时如何处理对象引用?