如何存储重复日期并记住夏令时

2024-02-23

我将事件存储在我的数据库中。我有“开始”和“结束”日期时间、“tickets_start”和“tickets_end”(门票销售实际开始/结束的时间 - 而不是实际活动的开始/结束的时间)。

到目前为止,我已经构建了一些方法来完成所有有趣的事情,例如在保存之前将日期/时间转换为 GMT,然后返回到各自的时区进行显示。

我将时区存储在 varchar 字段中,其值类似于“America/New_York”。

但是 - 现在我需要开始处理用户是否想要允许重复事件。我以前做过,这没什么大不了的,但从来没有跨越多个时区。

起初,我认为这没什么大不了的,但后来意识到 - 如果最初的开始日期是 7 月(例如),并且每月重复一次,持续一年,在某个时候,夏令时将使它成为现实这样,从 GMT 开始的转换时间就会有所不同。一个月,当转换 12:00 时,它会将其更改为 -5,而下个月,由于 DST,它会将其更改为 -4。

我当前的想法是,我将存储一个“dst”tinyint(1) 来确定是否在 DST 期间输入开始/结束日期,然后制定一种方法,在必要时将时间更改一小时。

但是 - 我想我会在这里问,希望也许有一个“正常”的情况,或者是我没有想到的简单的事情。

(cakephp 2.4.x)


首先,请认识到,在现代术语中,您应该说 UTC 而不是 GMT。它们大多是等效的,只是 UTC 的定义更精确。保留术语“GMT”来指代英国冬季有效的时区部分,偏移量为 UTC+0。

现在回答你的问题。 UTC 不一定是存储所有日期和时间值的最佳方式。它特别适用于past事件,或未来absolute事件,但对未来来说效果不太好local事件——尤其是未来再次发生的 events.

我写过这个在另一个答案上 https://stackoverflow.com/a/19170823/634824最近,这是本地时间比 UTC 更有意义的少数例外情况之一。主要争论点是“闹钟问题”。如果您按照 UTC 设置闹钟,您将在 DST 转换当天提前或晚起一小时。这就是为什么大多数人按当地时间设置闹钟的原因。

当然,你不能just如果您正在处理来自世界各地的数据,请存储当地时间。你应该存储一些不同的东西:

  • 重复事件的当地时间,例如“08:00”
  • 当地时间表示的时区,例如“America/New_York”
  • 重复模式,采用对您的应用程序有意义的任何格式,例如每天、每两周或每月的第三个星期四等。
  • 下一个即时UTC 日期和时间相当于您可以预测的最佳时间。
  • 也许(但并非总是)未来事件 UTC 日期和时间的列表,预测了未来的某个预定义时期(可能是一周,可能是 6 个月,可能是一两年,具体取决于您的需要)。

对于后两个,请了解,如果负责该时区的政府决定更改任何内容,则任何本地日期/时间的 UTC 等效值都可能会更改。由于每年都会有多个时区数据库更新,因此您需要制定一个计划订阅更新公告 https://mm.icann.org/mailman/listinfo/tz-announce and 更新您的时区数据库 http://pecl.php.net/package/timezonedb经常。每当您更新时区数据时,您都需要重新计算所有未来事件的 UTC 等效时间。

如果您计划显示跨越多个时区的任何类型的事件列表,那么拥有 UTC 等效值非常重要。这些是您将查询以构建该列表的值。

需要考虑的另一点是,如果事件安排在 DST 回退过渡期间发生的当地时间,您将必须决定该事件是发生在第一个实例(通常)还是第二个实例(有时),或两者(很少),并在您的应用程序中构建一种机制,以确保事件不会触发两次,除非您愿意。

如果您正在寻找一个简单的答案 - 抱歉,但没有。跨时区安排未来的活动是一项复杂的任务。

替代方法

有几个人向我展示了一种技术,他们可以do使用 UTC 时间进行调度,即选择本地时间的开始日期,将其转换为 UTC 进行存储,并存储时区 ID。然后在运行时,他们应用时区将原始 UTC 时间转换回本地时间,然后使用该本地时间来计算其他重复时间,就好像它是最初存储的时间一样。

虽然这项技术将work,其缺点是:

  • 如果在第一个实例运行之前发生时区更新更改了本地时间,则会打乱整个计划。这可以通过为“第一个”实例选择过去的时间来缓解,这样第二个实例实际上是第一个实例。

  • 如果时间确实是一个应该跟随用户的“浮动时间”(例如手机上的闹钟),您仍然必须存储它最初创建的区域的时区信息 - 即使那不是你想要跑步的区域。

  • 它增加了额外的复杂性,但没有任何好处。我会保留这种技术,用于您可能拥有仅 UTC 调度程序并试图改进时区支持的情况。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何存储重复日期并记住夏令时 的相关文章

  • 编写 PHP SQL 更新语句的最佳方法

    我有这个 PHP SQL 语句 updateCategory UPDATE category SET name name description description parent parent active active WHERE i
  • 在 Linux 控制台中返回一行?

    我知道我可以返回该行并用以下内容覆盖其内容 r 现在我怎样才能进入上一行来改变它呢 或者有没有办法打印到控制台窗口中的特定光标位置 我的目标是使用 PHP 创建一些自刷新的多行控制台应用程序 Use ANSI 转义码 http en wik
  • “composer”在 Windows 服务器中未被识别为内部或外部命令

    我使用的是Windows Server 2008操作系统 我下载作曲家安装程序 exe https getcomposer org download 并安装到我的电脑上 当我尝试时composer install 我收到错误 compose
  • 发送邮件时PEAR邮件验证失败

    由于我发现 PHP 中内置的邮件功能存在安全漏洞 因此我尝试使用 PEAR 我已经在本地主机 WAMP 服务器 2 2 上安装并进行了必要的配置 但是 每次我尝试发送电子邮件时 都会显示以下消息 error authentication f
  • 添加验证码到 Symfony2 登录

    我需要将验证码添加到我的登录页面 我正在使用 GregwarCaptchaBundle 和 FosUserBundle 目前我已经使用以下代码在登录时显示验证码
  • 使用 Kendo Upload 进行 Kendo Grid 内联编辑返回空结果

    我有 Kendo UI Gridinline编辑和我的领域之一 propertyLogo I use 剑道上传 https demos telerik com kendo ui upload index上传图像 使用kendoUpload函
  • #1214 - 使用的表类型不支持 FULLTEXT 索引

    我收到一条错误消息 指出该表类型不支持 FULLTEXT 索引 我怎样才能实现这个目标 这是我的桌子 CREATE TABLE gamemech chat id bigint 20 unsigned NOT NULL auto increm
  • 我如何修复此 php 代码导致的本月最后一天错误?

    下面的代码是我用于网站菜单的代码 它将当前月份页面的链接移动到月份更改时的链接列表的顶部 但在某些月份的 31 号 例如 4 月 这会失败 对于大多数链接 我得到了同一个月的两个链接 我已经阅读了 php 生成日期方式的问题 但不知道如何更
  • python - _mysql 无法打开包含文件:'config-win.h':安装 mysql-python 时没有这样的文件或目录

    我试图安装两个名为 mysql python 和 mysqlclient fork of mysql python 的 python 库 然后当我尝试使用 pip 安装它时出现此错误 Collecting mysql python Usin
  • WSDL 中的数组响应 - SOAP PHP

    在我的 wsdl 代码中 我得到一个整数 我想返回数组中的结果 为什么在我的输入中我只有一个整数 而我需要数组中的结果 因为在我的 php 函数中 我想从客户端选择的整数中的数据库返回信息 例如 我的客户发送1 在我的php中 我从数据库中
  • PHP 正则表达式查找特定的阿拉伯语关键字

    我需要找到一种可靠的方法来使用 PHP 搜索阿拉伯语单词 我要搜索的文本可能是英语或阿拉伯语 因此英语单词不能破坏系统 我一直在阅读 PHP 手册和其他一些材料 并认为我有一个正确的解决方案 但我将感谢一些正则表达式专家的一些意见 这项任务
  • 我如何知道是否启用了 PHP 缓存?

    我曾经认为缓存很难安装 所以我从来没有这样做过 在阅读了有关 APC 的内容后 它似乎很容易安装 我一直认为我必须修改应用程序中的大量 PHP 代码才能使用它 哈哈 不管怎样 我想安装APC 我可以使用 phpinfo 并注意到它没有在页面
  • MySQL更改表,添加具有唯一随机值的列

    我有一个表 我添加了一个名为phone 该表还有一个 id 设置为自动增量的主键 如何将随机值插入到电话列中 该值不会重复 以下 UPDATE 语句确实插入了随机值 但并非所有值都是唯一的 另外 我没有被卖掉 我投了phone字段也正确 但
  • 将 mod-rewrite 添加到现有 PHP 网站

    我正在更新一个 php 应用程序 该应用程序当前不使用 url 重写 目的是隐藏文件扩展名 网站总体结构如下 root index php login php page1 php page2 php page3 php page4 php
  • preg_match_all JS 等效吗?

    Javascript 中是否有与 PHP 的 preg match all 等效的函数 如果没有 将正则表达式的所有匹配项放入数组的最佳方法是什么 我愿意使用任何 JS 库来让它变得更容易 您可以使用match使用全局修饰符 gt gt g
  • 添加和完成 PHP 源代码文档的工具 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有几个已完成的较旧的 PHP 项目 其中有很多内容 我想以 javadoc phpDocumentor
  • MySQL 性能 DELETE 或 UPDATE?

    我有一个超过 10 7 行的 MyISAM 表 向其中添加数据时 我必须在最后更新 10 行 删除它们然后插入新行更快 还是更新这些行更快 应更新的数据不是索引的一部分 索引 数据碎片怎么样 UPDATE到目前为止要快得多 当你UPDATE
  • Laravel Valet 不工作。 127.0.0.1 连接被拒绝

    试图让代客泊车设置正常工作 当访问 127 0 0 1 时 连接被拒绝 这是我在访问 dev 站点设置之一时收到的消息 我已经确保 apache 已停止 并且一直在谷歌上搜索所有地方 但无法找到解决方案 有没有人遇到过这个或对下一步尝试什么
  • Zend 1.11 和 Doctrine 2 自动从现有数据库生成所需的一切

    我是 ORM 新手 我真的很想学习它 我按照本教程成功地使用 Zend 1 11 x 安装了 Doctrine 2 1 的所有类和配置 http www zendcasts com unit testing doctrine 2 entit
  • 在 ADO 查询 (mysql/MyConnector) 中使用参数

    今天我下载并安装了 MyConnector 这样我就可以通过 ADO 使用 Mysql 一切都安装好了 我可以与 ODBC 连接并从我的 delphi 环境进行连接 当我在运行时构建查询时 我收到一条错误消息 项目 Project1 exe

随机推荐