搜索
首页后端开发Python教程时区、偏移量和 ObjectScript,天哪!

您的使命

让我们假设您是一名国际行动间谍,一生致力于保护世界人民免受危险。 您收到以下任务:

美好的一天,特工 IRIS,

我们很抱歉打扰您在巴哈马的假期,但我们刚刚收到伦敦代理的消息,一颗“定时炸弹”将在洛杉矶人口稠密的地区引爆。 我们的消息来源称,“定时炸弹”将于今天下午 3:14 触发。

快点,人们指望着你!

问题

你赶紧站起来,准备前往洛杉矶,但你很快意识到你错过了一条关键信息; “定时炸弹”会在巴哈马时间下午 3:14 或洛杉矶时间下午 3:14 触发吗? ...或者甚至可能是伦敦时间下午 3:14。

您很快意识到,为您提供的时间(下午 3:14)并没有为您提供足够的信息来确定您何时需要到达洛杉矶。

为您提供的时间(下午 3:14)不明确。 您需要更多信息来确定准确时间。

一些解决方案

当您思考这个问题时,您意识到有一些方法可以克服为您提供的时间的模糊性:

  1. 您的消息来源可能提供了当地时间下午 3:14 的位置。 例如,洛杉矶、巴哈马或伦敦。

  2. 您的消息来源可以使用 UTC(协调世界时)等标准来为您提供与商定位置(例如伦敦格林威治)的偏移量。

幸福的结局

您致电消息来源并确认所提供的时间确实是洛杉矶时间下午 3:14。 您可以前往洛杉矶,在下午3:14之前解除“定时炸弹”,并迅速返回巴哈马结束您的假期。

要点

那么,这个思维练习的意义是什么? 我怀疑我们中的任何人都会遇到上述问题,但如果您使用将数据从一个位置移动到另一个位置的应用程序或代码(特别是如果这些位置位于不同时区),您需要注意 如何处理日期时间和时区。

时区很难!

嗯,时区并没有那么糟糕。 夏令时和政治边界使时区变得困难。

我以为我一直理解时区的“一般”概念:地球按时区分成垂直的切片,每个时区比东部时区晚一小时。

Time Zones and Offsets and ObjectScript, Oh My!

虽然这种简化适用于许多地点,但不幸的是,这条规则有很多例外。

Time Zones and Offsets and ObjectScript, Oh My!
参考:世界时区(维基百科)

使用 UTC(“起源”)进行标准化

为了简化传达特定时间的语言,世界决定使用 UTC(协调世界时)。 该标准将“原点”设置为经过伦敦格林威治的 0° 经度。

定义“偏移”

以UTC为基础,所有其他时区都可以相对于UTC来定义。 这种关系称为 UTC 偏移量

如果你有本地时间和偏移量,你就不再有模糊的时间(如上面我们的间谍示例所示);你有一个明确且具体的时间,没有任何含糊之处。

用于显示 UTC 偏移量的典型格式是 ±HHMM[SS[.ffffff]]。

  • 减号表示向 UTC 西边的偏移。
  • 加号表示向 UTC 东部的偏移。
  • HH 表示小时(以零填充)
  • MM 表示分钟(零填充)
  • SS 表示秒(以零填充)
  • .ffffff 表示秒小数

例如,在美国,东部标准 Zime 区域 (EST) 定义为 -0500 UTC。 这意味着 EST 中的所有地点均比 UTC 晚 5 小时。 如果 UTC 时间为晚上 9:00,则 EST 当地时间为下午 4:00。

在澳大利亚中西部标准时区 (ACWST),偏移量定义为 0845 UTC。 如果 UTC 时间为凌晨 1:00,则 ACWST 当地时间为上午 9:45。

夏令时

那么,回到上面的时区地图。 从图像中,您可以看到许多时区遵循国家和地区的政治边界。 这会使时区计算稍微复杂一些,但很容易理解。

不幸的是,在处理时间和时区时还需要考虑一个因素。

让我们看看洛杉矶。

在地图上,洛杉矶的 UTC 偏移量在标准时间中为 -8。 冬季通常采用标准时间,而夏季通常采用夏令时

夏令时 (DST) 将给定时区的时钟提前(通常在夏季月份提前一小时)。 政治区域选择遵循夏令时的原因有多种(例如节能、更好地利用日光等)。 夏令时的困难和复杂性在于,世界各地并未一致遵循夏令时。 根据您所在的位置,您所在的地区可能遵循也可能不遵循夏令时。

时区数据库

由于政治边界和夏令时的结合大大增加了确定特定时间的复杂性,因此需要时区数据库来将当地时间正确映射到相对于 UTC 的特定时间。 互联网号码分配机构 (IANA) 时区数据库是操作系统和编程语言使用的时区信息的常见来源。

数据库包含所有时区的名称和别名、偏移量信息、夏令时使用信息、时区缩写以及各种规则适用的日期范围。

有关时区数据库的副本和信息可以在 IANA 网站上找到。

大多数 UNIX 系统都有一个数据库副本,该副本通过操作系统的包管理器(通常安装在 /usr/share/zoneinfo 中)进行更新。 一些编程语言内置了数据库。 其他人通过图书馆提供它或可以读取系统的数据库副本。

时区名称/标识符

时区数据库包含许多特定时区的名称和别名。 许多条目的名称中都包含国家(或大陆)和主要城市。 例如:

  • 美国/纽约
  • 美国/洛杉矶
  • 欧洲/罗马
  • 澳大利亚/墨尔本

使用 ObjectScript 进行转换和格式化

所以,现在我们知道:

  • 当地时间(没有偏移量或位置的模糊时间)
  • UTC 偏移量(时间戳或位置相对于伦敦格林威治的 UTC“原点”的相对偏移量)
  • 夏令时(以时区偏移为代价来帮助文明的尝试)
  • 时区数据库(其中包括有关许多地点和地区的时区和夏令时遵守情况的信息)

了解了这一点,我们如何在 ObjectScript 中使用日期时间/时区?

***注意:我相信以下所有关于 ObjectScript 的陈述都是正确的,但如果我错误地表述了 ObjectScript 如何处理时区和偏移量,请告诉我。

内置变量和函数

如果您需要在运行 IRIS 的进程的系统时区内的各种格式之间转换时间戳,ObjectScript 的内置功能应该足够了。 以下是 ObjectScript 中各种与时间相关的变量/函数的简要列表:

  • $ZTIMESTAMP / $ZTS

    • IRIS 内部格式为 UTC 值(偏移量 0000)。
    • 格式:ddddd,sssss.ffffffff
  • $NOW(tzmins)

    • 当前系统本地时间以及给定的 tzmins 与 UTC 的偏移量。
    • 不考虑夏令时。
    • 默认情况下,tzmins 基于 $ZTIMEZONE 变量。
    • 格式:ddddd,sssss.ffffffff
  • $HOROLOG

    • 当前系统本地时间(基于 $ZTIMEZONE),考虑夏令时。
    • 格式:ddddd,sssss.ffffffff
  • $ZTIMEZONE

    • 返回或设置系统本地 UTC 偏移量(以分钟为单位)。
  • $ZDATETIME() / $ZDT()

    • 将 $HOROLOG 格式转换为特定的显示格式。
    • 可用于将系统本地时间转换为 UTC ( 0000)。
  • $ZDATETIMEH() / $ZDTH()

    • 将日期时间字符串转换为内部 $HOROLOG 格式。
    • 可用于从 UTC ( 0000) 转换为系统本地时间。

据我所知,这些函数只能使用本地系统的时区来操作日期时间。 似乎没有办法在 ObjectScript 中处理任意时区。

进入 Open Exchange 上的 tz 图书馆

为了适应任意时区之间的转换,我创建了 tz - ObjectScript 时区转换库。

该库访问系统上安装的时区数据库,为时区和格式之间的时间戳转换提供支持。

例如,如果您有洛杉矶本地时间(美国/洛杉矶),您可以将其转换为巴哈马使用的时区(美国/纽约)或伦敦使用的时区(欧洲/伦敦):

USER>zw ##class(tz.Ens).TZ("2024-12-20 3:14 PM", "America/Los_Angeles", "America/New_York")
"2024-12-20 06:14 PM"

USER>zw ##class(tz.Ens).TZ("2024-12-20 3:14 PM", "America/Los_Angeles", "Europe/London")
"2024-12-20 11:14 PM"

如果给您一个带有偏移量的时间戳,您可以将其转换为澳大利亚尤克拉 (Australia/Eucla) 的当地时间,即使您不知道原始时区:

USER>zw ##class(tz.Ens).TZ("2024-12-20 08:00 PM -0500", "Australia/Eucla")
"2024-12-21 09:45 AM +0845"

如果您使用 HL7 消息,tz 库有多种暴露于互操作性规则和 DTL 的方法,可帮助您轻松在时区、本地时间、带偏移量的时间等之间进行转换:

// Convert local time from one time zone to another      
set datetime = "20240102033045"
set newDatetime = ##class(tz.Ens).TZ(datetime,"America/New_York","America/Chicago")

// Convert local time to offset      
set datetime = "20240102033045"
set newDatetime = ##class(tz.Ens).TZOffset(datetime,"America/Chicago","America/New_York")

// Convert offset to local time      
set datetime = "20240102033045-0500"
set newDatetime = ##class(tz.Ens).TZLocal(datetime,"America/Chicago")

// Convert to a non-HL7 format   
set datetime = "20240102033045-0500"
set newDatetime = ##class(tz.Ens).TZ(datetime,"America/Chicago",,"%m/%d/%Y %H:%M:%S %z")

概括

感谢您跟随我踏上这次“国际之旅”,我们遇到了时区、夏令时、世界地图和“定时炸弹”。 希望这能够阐明(并简化)处理日期时间和时区的许多复杂性。

查看 tz - ObjectScript 时区转换库,如果您有任何问题(或者对我所说的内容进行更正/澄清),请告诉我。

谢谢!

参考资料/有趣的链接

  • https://en.wikipedia.org/wiki/Cooperative_Universal_Time
  • https://en.wikipedia.org/wiki/Time_zone
  • https://en.wikipedia.org/wiki/Daylight_ saving_time
  • https://www.worldtimeserver.com/learn/unusual-time-zones/
  • https://www.worldtimeserver.com/learn/history-of-time-zones/
  • https://www.worldtimeserver.com/learn/what-is-a-time-zone/
  • https://en.wikipedia.org/wiki/Tz_database
  • https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
  • https://en.wikipedia.org/wiki/Internet_Assigned_Numbers_Authority
  • https://www.iana.org/time-zones
  • https://www.gnu.org/software/libc/manual/html_node/Calendar-Time.html

以上是时区、偏移量和 ObjectScript,天哪!的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
Python vs. C:了解关键差异Python vs. C:了解关键差异Apr 21, 2025 am 12:18 AM

Python和C 各有优势,选择应基于项目需求。1)Python适合快速开发和数据处理,因其简洁语法和动态类型。2)C 适用于高性能和系统编程,因其静态类型和手动内存管理。

Python vs.C:您的项目选择哪种语言?Python vs.C:您的项目选择哪种语言?Apr 21, 2025 am 12:17 AM

选择Python还是C 取决于项目需求:1)如果需要快速开发、数据处理和原型设计,选择Python;2)如果需要高性能、低延迟和接近硬件的控制,选择C 。

达到python目标:每天2小时的力量达到python目标:每天2小时的力量Apr 20, 2025 am 12:21 AM

通过每天投入2小时的Python学习,可以有效提升编程技能。1.学习新知识:阅读文档或观看教程。2.实践:编写代码和完成练习。3.复习:巩固所学内容。4.项目实践:应用所学于实际项目中。这样的结构化学习计划能帮助你系统掌握Python并实现职业目标。

最大化2小时:有效的Python学习策略最大化2小时:有效的Python学习策略Apr 20, 2025 am 12:20 AM

在两小时内高效学习Python的方法包括:1.回顾基础知识,确保熟悉Python的安装和基本语法;2.理解Python的核心概念,如变量、列表、函数等;3.通过使用示例掌握基本和高级用法;4.学习常见错误与调试技巧;5.应用性能优化与最佳实践,如使用列表推导式和遵循PEP8风格指南。

在Python和C之间进行选择:适合您的语言在Python和C之间进行选择:适合您的语言Apr 20, 2025 am 12:20 AM

Python适合初学者和数据科学,C 适用于系统编程和游戏开发。1.Python简洁易用,适用于数据科学和Web开发。2.C 提供高性能和控制力,适用于游戏开发和系统编程。选择应基于项目需求和个人兴趣。

Python与C:编程语言的比较分析Python与C:编程语言的比较分析Apr 20, 2025 am 12:14 AM

Python更适合数据科学和快速开发,C 更适合高性能和系统编程。1.Python语法简洁,易于学习,适用于数据处理和科学计算。2.C 语法复杂,但性能优越,常用于游戏开发和系统编程。

每天2小时:Python学习的潜力每天2小时:Python学习的潜力Apr 20, 2025 am 12:14 AM

每天投入两小时学习Python是可行的。1.学习新知识:用一小时学习新概念,如列表和字典。2.实践和练习:用一小时进行编程练习,如编写小程序。通过合理规划和坚持不懈,你可以在短时间内掌握Python的核心概念。

Python与C:学习曲线和易用性Python与C:学习曲线和易用性Apr 19, 2025 am 12:20 AM

Python更易学且易用,C 则更强大但复杂。1.Python语法简洁,适合初学者,动态类型和自动内存管理使其易用,但可能导致运行时错误。2.C 提供低级控制和高级特性,适合高性能应用,但学习门槛高,需手动管理内存和类型安全。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

SublimeText3 英文版

SublimeText3 英文版

推荐:为Win版本,支持代码提示!

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

MinGW - 适用于 Windows 的极简 GNU

MinGW - 适用于 Windows 的极简 GNU

这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器