夏令时和时区最佳实践[关闭]

2023-11-24

我希望使这个问题及其答案成为处理夏令时的权威指南,特别是处理实际的转换。

如果您有什么要补充的,请做

许多系统都依赖于保持准确的时间,问题在于夏令时导致的时间变化 - 将时钟向前或向后移动。

例如,订单接收系统中的业务规则取决于订单时间 - 如果时钟发生变化,规则可能不会那么清晰。订单的时间应该如何持久化?当然,场景有无数种——这只是一个说明性的场景。

  • 您是如何处理夏令时问题的?
  • 您的解决方案包含哪些假设? (在这里寻找上下文)

同样重要的是:

  • 你尝试了什么但不起作用?
  • 为什么它不起作用?

我对编程、操作系统、数据持久性和问题的其他相关方面感兴趣。

一般答案很好,但我还想查看详细信息,特别是如果它们仅在一个平台上可用。


答案和其他数据摘要:(请添加您的)

Do:

  • 每当您提到确切的时间时刻时,请根据不受夏令时影响的统一标准来保留时间。 (GMT 和 UTC 在这方面是等效的,但最好使用术语 UTC。请注意,UTC 也称为Zulu or Z time.)
  • 相反,如果您选择使用本地时间值保留(过去的)时间,请包括该特定时间相对于 UTC 的本地时间偏移量(该偏移量可能会在一年中发生变化),以便稍后可以明确地解释时间戳。
  • 在某些情况下,您可能需要存储bothUTC 时间和等效的本地时间。通常这是通过两个单独的字段完成的,但某些平台支持datetimeoffset可以将两者存储在单个字段中的类型。
  • 将时间戳存储为数值时,请使用Unix时间- 这是自那时以来的整秒数1970-01-01T00:00:00Z(不包括闰秒)。如果您需要更高的精度,请改用毫秒。该值应始终基于 UTC,而不进行任何时区调整。
  • 如果您稍后可能需要修改时间戳,请包含原始时区 ID,以便您可以确定偏移量是否相对于记录的原始值已发生更改。
  • 在安排未来的事件时,通常首选当地时间而不是 UTC,因为偏移量发生变化是很常见的。查看答案, and 博客文章.
  • When storing whole dates, such as birthdays and anniversaries, do not convert to UTC or any other time zone.
    • 如果可能,请存储在不包含一天中的时间的仅日期数据类型中。
    • 如果此类类型不可用,请确保在解释该值时始终忽略当天的时间。如果您不能确保当天的时间会被忽略,请选择中午 12:00 而不是午夜 00:00 作为当天更安全的代表时间。
  • 请记住,时区偏移并不总是整数小时(例如,印度标准时间为 UTC+05:30,尼泊尔使用 UTC+05:45)。
  • 如果使用 Java,请使用java.time适用于 Java 8 及更高版本。
  • 其中大部分java.time功能向后移植到 Java 6 和 7三十后端口图书馆。
  • 进一步适配了早期的Android(三十ABP图书馆。
  • 这些项目正式取代了令人尊敬的乔达时间,现在在维护模式。 Joda-Time、ThreeTen-Backport、三十额外, java.time课程,以及JSR 310由同一个人领导,史蒂芬·科尔伯恩.
  • 如果使用.NET,考虑使用野田时间.
  • 如果在没有 Noda Time 的情况下使用 .NET,请考虑DateTimeOffset通常是比DateTime.
  • 如果使用 Perl,请使用DateTime.
  • 如果使用 Python 3.9 或更高版本,请使用内置zoneinfo用于处理时区。否则,使用dateutil or arrow。年龄较大的pytz一般情况下可以避免图书馆。
  • 如果使用 JavaScript,请避免使用旧版本moment.js or 时刻时区库,因为它们不再被积极维护。请参阅Moment.js 项目状态更多细节。相反,请考虑Luxon, date-fns, day.js, or js-joda.
  • 如果使用 PHP > 5.2,请使用由DateTime, and DateTimeZone类。使用时要小心DateTimeZone::listAbbreviations() - 查看答案。要使 PHP 保持最新的 Olson 数据,请定期安装时区数据库PECL封装;查看答案.
  • If using C++, be sure to use a library that uses the properly implements the IANA timezone database. These include cctz, ICU, and Howard Hinnant's "tz" library. In C++20 the latter is adopted into the standard <chrono> library.
    • 不使用Boost用于时区转换。尽管its API声称支持标准 IANA(又名“zoneinfo”)标识符,它粗略地映射它们POSIX 风格的数据,而不考虑每个区域可能有的丰富的变化历史。 (此外,该文件已不再维护。)
  • 如果使用 Rust,请使用chrono.
  • 大多数业务规则使用民用时间,而不是 UTC 或 GMT。因此,在应用应用程序逻辑之前,计划将 UTC 时间戳转换为本地时区。
  • 请记住,时区和偏移量不是固定的,可能会发生变化。例如,历史上美国和英国使用相同的日期来“向前”和“向后”。然而,2007 年,美国更改了时钟更改的日期。这意味着一年中有 48 周伦敦时间与纽约时间相差 5 小时,而 4 周(春季 3 周,秋季 1 周)则相差 4 小时。在涉及多个区域的任何计算中请注意此类事项。
  • 考虑时间类型(实际事件时间、广播时间、相对时间、历史时间、重复时间),您需要存储哪些元素(时间戳、时区偏移量和时区名称)才能正确检索 - 请参阅《时间类型》这个答案.
  • 让您的操作系统、数据库和应用程序 tzdata 文件在它们之间与世界其他地方保持同步。
  • 在服务器上,将硬件时钟和操作系统时钟设置为 UTC 而不是本地时区。
  • 不管前面的要点如何,服务器端代码,包括网站,应该never期望服务器的本地时区是任何特定的时区。查看答案.
  • 更喜欢在应用程序代码中根据具体情况处理时区,而不是通过配置文件设置或默认值全局处理时区。
  • Use NTP所有服务器上的服务。
  • 如果使用FAT32,请记住时间戳存储为本地时间,而不是 UTC。
  • 在处理重复发生的事件(例如每周电视节目)时,请记住时间会随着 DST 的变化而变化,并且不同时区的时间也会有所不同。
  • 始终将日期时间值查询为包含下限,排除上限 (>=, <).

Don't:

  • 不要混淆“时区”,例如America/New_York带有“时区偏移”,例如-05:00。他们是两个不同的东西。看时区标签 wiki.
  • 不要使用 JavaScriptDate对象在旧版 Web 浏览器中执行日期和时间计算,如 ECMAScript 5.1 及更低版本设计缺陷这可能会错误地使用夏令时。 (此问题已在 ECMAScript 6 / 2015 中修复)。
  • 永远不要相信客户的时钟。这很可能是不正确的。
  • 不要告诉人们“始终在任何地方使用 UTC”。这种广泛传播的建议是对本文档前面描述的几个有效场景的短视。相反,请为您正在使用的数据使用适当的时间参考。 (时间戳可以使用 UTC,但未来时间安排和仅日期值不应使用。)

Testing:

  • 测试时,请确保测试西方、东方、北方和Southern半球(实际上在全球每个季度,因此有 4 个区域),正在进行和未进行 DST(给出 8 个),以及一个不使用 DST 的国家(另外 4 个覆盖所有区域,总共 12 个)。
  • 测试 DST 的转换,即当前处于夏季时间时,选择冬季的时间值。
  • 测试边界情况,例如时区为 UTC+12,采用 DST,使本地时间夏季 UTC+13,甚至冬季 UTC+13 的地方
  • 测试所有第三方库和应用程序,并确保它们正确处理时区数据。
  • 至少测试半小时时区。

参考:

  • 详细的timezoneStack Overflow 上的标签 wiki 页面
  • Olson 数据库,又名 Tz_database
  • IETF 起草维护 Olson 数据库的程序
  • 时区和 DST 来源
  • ISO 格式 (ISO 8601)
  • Olson 数据库和 Windows 时区 ID 之间的映射(来自 Unicode 联盟)
  • 维基百科上的时区页面
  • StackOverflow 问题已标记dst
  • StackOverflow 问题已标记timezone
  • 处理 DST - Microsoft DateTime 最佳实践
  • 维基百科上的网络时间协议

Other:

  • 游说您的代表结束令人憎恶的夏令时。我们总是可以希望...
  • 大堂为地球标准时间
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

夏令时和时区最佳实践[关闭] 的相关文章

  • 如何在 C# 中获取我当地时间的 UTC 等效时间

    我的机器处于 PDT 如果我说 DateTime Now 那么我将获得相当于 2012 年 9 月 18 日上午 6 00 00 的当地时间 我想获得此日期时间实例的 UTC 等效值 UTC 时间将比 PDT 早 7 小时 比 PST 早
  • 使用每日频率格式化 x 轴

    我正在尝试获取每日数据图 我有 3 个月的数据 每天都很难指出 如何格式化 x 轴 以便我可以获得每个日期 可以使用以下命令更改主要刻度的频率set major locator mdates DayLocator interval 5 如下
  • Java:getTimeZone不返回默认值

    我有以下指示 TimeZone zone TimeZone getTimeZone Asia Toyo 显然 它应该返回 null 但它会返回默认时区 这不是我的情况所需的行为 来自 Java 文档 返回指定的TimeZone 或 GMT
  • 在Python中从feedparser解析不同的日期格式?

    我正在尝试通过以下方式获取两个不同 RSS 提要中的条目的日期feed解析器 http feedparser org 这是我正在做的事情 import feedparser as fp reddit fp parse http www re
  • PHP strtotime返回Mysql UNIX_TIMESTAMP的不同值

    我在 stackoverflow 上搜索过帖子 发现了一些类似的帖子 但我认为这是一篇不同的帖子 我的 PHP 和 Mysql 服务器的时区全部设置为 UTC 在表中我使用时间戳字段 值为 2010 11 08 02 54 15 我使用这样
  • 如何在 SQL 中的时区中使用“America/New_York”

    我有这段代码在 SQL 中运行良好 但是我想使用不同的时区格式 例如 America New York 代替 US Eastern Standard Time SELECT TODATETIMEOFFSET CAST CURRENT TIM
  • Python:按小时、天和月过滤 Pandas 中的数据帧(按年分组)

    作为 Pandas 的新手 我必须进行大量挖掘才能找到这个问题的解决方案 考虑到我仍然需要解决边界问题 我想知道更好的方法来解决这个问题 我有一组从 2009 年到 2012 年的 10 分钟 功率 测量值 并且希望获得所有年份的小时和日
  • 如何在 Javascript 中获取时区名称(PDT、EST 等)? [复制]

    这个问题在这里已经有答案了 使用 Javascript 有没有办法根据用户的设备获取用户的时区名称 PDT EST 等 我尝试过的代码 const timezone jstz determine const userTimezone tim
  • C# 从今天起 30 天

    我需要我的应用程序从今天起 30 天后过期 我会将当前日期存储在应用程序配置中 如何检查应用程序是否已过期 我不介意用户是否将时钟调回来并且应用程序可以正常工作 用户太愚蠢而不会这样做 if appmode Trial string dat
  • 将 Spring MVC 中的默认/全局日期格式设置为 ISO 8601

    我有一个简单的 Spring 控制器 RequestMapping value method RequestMethod GET public void search MyDTO dto And MyDTO public class MyD
  • 如何在 JavaScript 中将日期时间微格式转换为本地时间?

    我有一个页面当前正在使用日期时间微格式 http microformats org wiki datetime design pattern显示时间戳 但我只显示我自己的时区的人类可读时间
  • grails/mysql 时区更改

    完成更改应用程序时区的最佳方法是什么 在我看来 必须发生以下情况 服务器 TZ 已被系统管理员更改 mysql必须重新启动 数据库中每个基于时间的列都必须使用convert tz 或等效方法更新所有值 因此 要么必须编写一个 mysql 脚
  • 如何在 Java 中向时间戳添加/减去时区偏移量?

    我正在使用 JDK 8 并且玩过ZonedDateTime and Timestamp很多 但我仍然无法解决我面临的问题 假设我得到了格式化的Timestamp在格林威治标准时间 UTC 我的服务器位于某处 假设它设置为Asia Calcu
  • C# 中两个日期之间的周差

    我正在尝试在 C 中创建一个函数 返回两个日期之间的周差 其目标是提供以下相同的结果 select datediff ww 2018 04 13 2018 04 16 as diff 在上面的示例中 这些日期之间只有 3 天 但它们位于不同
  • 改进R中从google获取股票新闻数据的功能

    我已经编写了一个函数来从 Google 获取和解析给定股票代码的新闻数据 但我确信有一些方法可以改进它 对于初学者来说 我的函数返回一个 GMT 时区的对象 而不是用户当前的时区 如果传递的数字大于 299 它就会失败 可能是因为 goog
  • datetime.datetime.now() 返回旧值

    我正在通过匹配日期查找 python 中的数据存储条目 我想要的是每天选择 今天 的条目 但由于某种原因 当我将代码上传到 gae 服务器时 它只能工作一天 第二天它仍然返回相同的值 例如当我上传代码并在 07 01 2014 执行它时 它
  • 类型错误:“datetime.datetime”和“str”的实例之间不支持“>”

    我是 python 日期和时间类型的新手 我有一个日期值 date 2018 11 10 10 55 31 00 00 我需要检查该日期值是否超过 90 天 我试过 from datetime import datetime from da
  • 仅从日期计算夏令时

    我正在使用 Arduino 和实时时钟芯片 该芯片补偿了闰年等 因此它始终具有正确的日期 但我认为由于区域复杂性 它不处理夏令时 时钟可以给出日 月 年 从 1 开始 以及星期几 星期日 0 到星期六 6 因为我需要与用户输入的日期和时间进
  • 如何使用 SimpleDateFormat 解析多种格式的日期

    我正在尝试解析文档中的一些日期 用户似乎以类似但不完全相同的格式输入了这些日期 以下是格式 9 09 9 2009 09 2009 9 1 2009 9 1 2009 尝试解析所有这些内容的最佳方法是什么 这些似乎是最常见的 但我想让我困扰
  • 如何在jquery中获取保存时间和当前时间的差异?

    我想在 javascript 或 jquery 中获取保存时间和当前时间之间的时差 我节省的时间看起来像Sun Oct 24 15 55 56 GMT 05 30 2010 java中的日期格式代码如下 String newDate 201

随机推荐

  • 为什么要将 Java 接口方法声明为抽象方法?

    今天我使用了 Eclipse 的 拉接口 重构功能来创建基于现有类的接口 该对话框提供了将新接口的所有新方法创建为 抽象 方法的功能 这样做有什么好处呢 我认为允许将接口方法声明为抽象这一事实是该语言的一个多余且无害的功能 并未受到特别鼓励
  • UINavigationItem提示问题

    我在 UINavigationItem 上遇到提示问题 但无法解决 我有一个主视图控制器和一个详细视图控制器 当我从主控推送到详细信息时 详细信息视图控制器上会显示提示 但是 当我弹回到主视图控制器时 视图不会调整大小 并且窗口会显示出来
  • 如何更改 Sql Server 2005 中 UDT 的基本类型?

    我的类型为 varchar 50 类型的 x 如何将其更改为 varchar 100 看来我不能啊 你不能 你能做的是 使用 OBJECT DEFINITION 编写包含该类型的所有对象的脚本 放下它们 重新创建具有新长度的类型 重新创建对
  • 在 v21 中设置 AppCompatButton 的样式,使其没有阴影且角半径为零

    我在 XML 布局中定义了一个 AppCompatButton 并为其设置了一个主题 如下所示 android theme style CustomAccentOverlay 我已经设置 android stateListAnimator
  • 为什么“新”运算符使用 -= 来分离事件处理程序?

    为什么我必须使用以下内容来分离事件 object myEvent new MyEvent EventHandler 我有些恼怒new操作员正在工作 有人可以解释一下吗 Update 我已经知道我不必使用 new 运算符来分离事件 但它仍然是
  • 用于自然语言处理的 Java 或 Python [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 我想知道哪种编程语言更适合自然语言处理 Java or Python 我发现了很多有关它的问题和答案 但我仍然迷失于选择使用哪一个 我想知道 Java 使用哪个 NLP 库 因为有很多库
  • 如何将 .net 错误消息语言更改为英语

    我使用的是VS2012 net 4 5和Win7专业版 Win7 是土耳其语 现在我收到土耳其语的错误消息 在Win7专业版中无法安装 卸载语言包 是否可以在不重新安装 VS 或 net pack 的情况下更改错误消息语言 这对我有用 开始
  • 通过连接键来展平地图

    给定一个仅包含关键字键的嵌套映射 例如 foo bar 1 baz 2 3 qux quux 4 corge 5 我该如何实施flatten map以便 flatten map foo bar 1 baz 2 3 qux quux 4 co
  • 如何在java中格式化持续时间? (例如格式 H:MM:SS)

    我想使用 H MM SS 等模式来格式化持续时间 以秒为单位 java 中当前的实用程序旨在格式化时间而不是持续时间 如果您不想拖入库 则可以使用格式化程序或相关快捷方式自行完成 例如 给定整数秒数 s String format d 02
  • sizeof 运算符在预处理器 #if 指令中起作用吗?

    我们可以使用sizeof运算符在 if宏 如果是 怎么办 如果没有 为什么 是否sizeof预处理器中的操作员工作 if指令 No the sizeof 运算符在 C 预处理器条件指令中不起作用 例如 if and elif 原因是 C 预
  • 模拟 Guid.NewGuid()

    假设我有以下实体 public class User public int Id get set public string Username get set public Guid UserGuid get set public Guid
  • Laravel 5,查看::分享

    我正在尝试做一个view share current user Auth User 但在 laravel 5 中我找不到在哪里执行此操作 在 L4 中你可以在 baseController 中执行此操作 但那个不再存在 格兰特 格伦 我正在
  • 隐藏表格滚动条

    经过一些研究 我发现我必须设置表格的 tbody display block overflow auto 启用 html 表格上的滚动 是否有可能隐藏每个现代浏览器 Chrome Safari Firefox 上的通用滚动条 我尝试了一些解
  • python请求http响应500(可以在浏览器中访问站点)

    我试图找出我在这里做错了什么 但我总是迷失方向 在 python 2 7 中 我运行以下代码 gt gt gt import requests gt gt gt req requests request GET https www zoma
  • Wix(VS 安装程序)- 缺少编辑器工具栏

    我的电脑上安装了 Wix 3 10 扩展至 Visual Studio 2015 我创建了一个基于 Wix 的安装项目 可以运行 在安装项目中 通常会有一些图标 安装工具 文件系统 注册表 UI 服装操作 但它们目前缺失 您可以在任何 Wi
  • 如何从 Firefox 插件执行 Windows 命令?

    如何使用 Firefox 插件执行 Windows 命令并显示其输出 例如 ping www stackoverfow com 我只是想通过执行打包在一起的二进制文件 或 可执行文件或运行 Windows 命令来探索更多 Firefox 插
  • Delphi、MDI 与多文档界面的选​​项卡

    我正在开发一个多文档应用程序 目前它使用 MDI 这对我 作为开发人员 以及我相信的用户来说都非常方便 然而有一个 反对 我还没有找到解决办法quickly load many到目前为止 子窗口 每次创建窗口并最大化以填充父窗口区域时 都会
  • 安装 Angular CLI 时收到错误警告

    我是这个平台的新手 我安装了Node js但是当我尝试运行命令时npm install g angular cli我收到这个错误 npm WARN deprecated email protected Legacy versions of
  • git checkout 会更新所有文件吗?

    新问题 我想确保我理解这一点 When I git checkout
  • 夏令时和时区最佳实践[关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我希望使这个问题及其答案成为处理夏令时的权威指南 特别是处理实际的转换 如果您有什么要补充的 请做 许多系统都依赖于保持准确的时间 问题在于夏令时导致的时间变化 将时钟向前或向后