如何编写时区源文件

0、背景

① 修改TZ环境变量改变时区不能立即生效。要求设置时区后立即生效,只能用修改/etc/localtime方式。
② 原文作者 Bill Seymour,想要查看原文,点击官网地址https://www.iana.org/time-zones下载 zic 源码,源码目录中的 tz-how-to.html 既原文。
③ 时区源文件,经zic编译后,可生成时区文件。
④ 约定:
世界标准时间为 “UTC”,
本地时间为 “UTC+时区”,
墙上时间为 “UTC+时区[+夏令时偏移]”。([ ]中的内容表示可缺省)
在和夏令时对比的语境下,
“UTC+时区+夏令时偏移” 为夏令时
“UTC+时区” 为标准时间

本文以“美国/芝加哥”和“太平洋/檀香山”时区作为示例,说明时区源文件中各个字段的含义。另一个了解时区原文件格式的途径为时区编译器 zic 的“man page”(译者认为man page更基础、切中要害,本文更生动、细节拉满),如果读者已经下载了 zic 的源码,则不难发现zic 源码目录下的 zic.8.txt 文件内容与man 8 zic罗列出的内容完全相同。

1、芝加哥夏令时 Rule 行举例

只设置时区其实相当简单,麻烦就麻烦在各国甚至各个城市五花八门的附着在时区上的夏令时规则,因此讨论论时区时,不可避免地要涉及标准时间夏令时之间的切换规则。zic 源码 data 子目录中的时区源文件 northamerica 给出了芝加哥从始至今的夏令时规则,如图1,

图1 芝加哥夏令时 Rule 行举例

接下来解释图1中直观上不易理解的几列的含义,

  • TYPE 列正常情况下不会被使用到,填一个连字符即可。zic 源码 2007j 版本,既撰写本文时的最新版本中,TYPE 列只填充一个连字符,表示 null 值。(从 zic.8.txt 的描述来看,这似乎是一种定制的、从年份集合中删除年份的机制。时区源文件 pacificnew 中用到了 TYPE 列,用于确定某一年是否会举行美国总统选举,但该文件的内容都被注释掉了,感兴趣的可以研究一下,这里不作展开。)
  • SAVE 列表示夏令时标准时间基础上偏移多少。使用标准时间则为0,使用夏令时则通常为1小时;但原则上,没有理由不能接受其他值。
  • LETTER(或LETTER/S)一般填写时区名缩写中的差异部分,如果时区缩写没有差异部分,或者图省事,可以用连字符填写。例如,在中央时区缩写是 CST(Central Standard Time)或 CDT(Central Daylight Time)的差异部分是字母 S 和 D;因此上图芝加哥 Rule 的 LETTER 栏中填的是 S 或 D。下文谈到 Zone 行时会再次详细举例 LETTER 该怎么填。

注意,Rule 行同时具有转换态(transitions)和稳定态(steady states):
● 一方面,它们代表标准时间夏令时之间的转换;一段给定的时期内(一组非空的连续日历年),可以有任意数量的 Rule 行。
● 另一方面,SAVE 和 LETTER 列包含转换之间稳定的状态。当讨论 US rules 时再详述。

图1中,
Rule行1:1920年在6月13日切到夏时制,
Rule行3:1921年在3月的最后一个星期日切到夏时制,
Rule行2:这两年,都在10月的最后一个星期天切回标准时间。
Rule行4:同样,1922年到1966年,切到夏时制的规则是相同的,既4月的最后一个星期日。
但回到标准时间的规则在这期间(1922年到1966年)发生了变化。
Rule行5:1992-1954,在9月的最后一个星期日切到标准时间。
Rule行6:1955-1966,在10月的最后一个星期日切到标准时间。
接下来看一下更有趣的 US rules。

2、美国夏令时 Rule 行举例

图2 美国夏令时 Rule 行举例

这里有两件有趣的事情需要注意。

  • 首先,AT 列中的时间不一定是墙上时间。时间后缀可以为s(standard)表示标准时间;也可以后缀 g(GMT)、z(Zulu)、u(UTC),这三个后缀都表示本初子午线的世界标准时间;也可以后缀 w(wall clock),意思是墙上时间,但通常不会后缀 w,不显示指出后缀时 w 就是默认值。

  • 其次,ON 列中的日期,除了 lastSun 和特定日期之外,还可以有 Sun>=x 或 Sun<=x 的形式,其中x是当月的某日。例如,Sun>=8 表示当月第8天之后(包含第8天)的第一个星期日”,既一个月中的第二个星期日。此外,尽管上面没有例子,工作日可以仿照Sun的形式,比如一个月中的第2个星期三可以表示为:Wed>=8。

从图2我们可以总结出更多有关夏令时规则的事实:

  • 切到夏令时和切到标准时间的规则是不同的规则集;并且这两个集合可以独立地改变。例如,1967-2006,恢复标准时间的规则保持不变,但向夏令时切换的规则在同一时期发生了多次变化。也有一些时期没有定义规则,如1946-1966,因此这些年要么没有发生任何切换,要么一些更具地方性的规则在运行(一个州或一个县)。
  • SAVE 和 LETTER 列含有稳定状态的意味,而不是非得转换。例如,1945.8.14 发生的从“战争时期”到“和平时期”的转变。SAVE 列中的1:00 并不是直接将时钟拨快一小时,而是时钟应该比标准时间快一个小时,因为上一条规则已经比标准时间快1小时了,所以1945.8.14这条 Rule 并不会将时钟再拨快1小时。

3、Zone 行举例

好的,现在让我们来看一个 Zone record:

图3 Zone 行举例

Zone 和 Rule 之间有几个有趣的区别

  • 首先,一个时区文件中可以有任意数量的 Rule 行,但只能有一个 Zone 行。Zone 行的关键字 Zone 和时区名称只出现一次,其余列可能有多行紧随Zone首行之后,但最后一行的 [UNTIL] 列一定为空。
  • (没看懂,无法翻译)Second, and more fundamentally, each line of a Zone represents a steady state, not a transition between states. The state exists from the date and time in the previous line’s [UNTIL] column up to the date and time in the current line’s [UNTIL] column. In other words, the date and time in the [UNTIL] column is the instant that separates this state from the next. Where that would be ambiguous because we’re setting our clocks back, the [UNTIL] column specifies the first occurrence of the instant. The state specified by the last line, the one without anything in the [UNTIL] column, continues to the present.

Zone record 第一行通常指定在引入标准时间之前观测到的平均太阳时。Since there’s no line before that, it has no beginning. 😎 对于国际日期变更线附近的一些地方,前两行显示的太阳时相差24小时;这对应于日期线的移动。例如:

#Zone  NAME             STDOFF     RULES   FORMAT   [UNTIL]
Zone   America/Juneau   15:02:19   -       LMT      1867 Oct 18 
                        -8:57419   -       LMT      ... 

1867年美国从俄罗斯手中购买阿拉斯加时,日期变更线从阿拉斯加/加拿大边境移动到白令海峡;阿拉斯加的时间比过去早了24小时(6 October in the Julian calendar, which Russia was still using then for religious reasons, was followed by a second instance of the same day with a different name, 18 October in the Gregorian calendar. Isn’t civil time wonderful? 8-))

LMT(Local Mean Time)当地平均时间,这是tz数据库发明的词,可能在当前时期从未实际使用过。此外,该值除了出现在 Zone 第一行外,几乎可以肯定是错误的。(tz数据库通常不会为1970年后没有发生重大事件的地方提供单独的区域记录。)

RULES 列表示是否执行夏令时,可以填如下值:

  • 连字符,一种空值,意味着未启用夏令时。
  • 一段时间(通常是“1:00”,但不绝对,意思是一个小时)意味着我们已经将时钟拨快了这个时间。
  • Rule 名。

一段时间举例:

#Zone  NAME               STDOFF     RULES   FORMAT   [UNTIL]
Zone   Pacific/Honolulu   ...                         1933 Apr 30  2:00 
                          -10:30     1:00    HTD      1933 May 21 12:00 
                          ... 

STDOFF 列填写标准时间偏移,夏威夷在1933年尝试了三周的夏令时(但最终因本地人不喜欢而不再使用 8-)),所以这段时间的墙上时间是GMT−10:30+1:00=GMT−9:30。

FORMAT 列指定时区名称的常用缩写,为以下四种形式之一:

  • 时区缩写,它是一个由三个或三个以上字符组成的字符串,这些字符是字母、数字、+ 、-。
  • 字符串“%z”,在这种情况下,“%z”将替换为数字时区缩写
  • 一对由斜线(‘/’)分隔的时区缩写,在这种情况下,第一个字符串是标准时间名称的缩写,第二个字符串是夏令时名称的缩写
  • 一个包含“%s”的字符串,在这种情况下,“%s”将被相应 Rule 行的 LETTER 列中的文本替换,并且生成的字符串应该是时区缩写

只有当有一个命名 Rule 生效时,最后两种形式才有意义。

斜线的一个例子是:

#Zone  NAME               STDOFF     RULES   FORMAT   [UNTIL]
Zone   Europe/London      ...                         1996 
                          00:00      EU      GMT/BST       

英国目前的时间被称为格林尼治平均时间或英国夏令时间。

zic.8.txt 中没有完全解释的一个问题是,切换到命名规则时会发生什么。SAVE 和 LETTER 数据应初始化到什么值?

  • 如果至少发生了一次转换,请使用最新的 SAVE 和 LETTER 数据。
  • 如果在任何转换发生之前切换到命名规则,则假定标准时间(SAVE为0),并使用 SAVE 为零的最早转换的 LETTER 数据。

关于 FORMAT 列的最后三件事:

  • tz数据库提供了流行英语中时区的缩写。例如,太平洋/火奴鲁鲁地区(如下图所示)的最后一行给出了“夏威夷标准时间”的“HST”,尽管该时区的法定名称是“夏威夷-阿留申标准时间”。作者读到,澳大利亚也有一些地方的流行时区名称与法定时区名称不同。
  • 没有尝试将缩写本地化。它们是通过“%Z”格式说明符返回到“C”区域设置中的C的strftime函数的值。
  • 如果没有普遍接受的时区缩写,则使用数字偏移,例如+07表示格林尼治之前的7小时。按照惯例,-00用于无人居住的区域,其中偏移为零,但在某种意义上,真正的偏移是未定义的。

4、完整夏威夷时区规则举例

最后一个例子是夏威夷的完整历史时区规则:

图4 完整的夏威夷时区规则举例

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/746313.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[leetcode] smallest-k-lcci. 最小的k个数

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:vector<int> smallestK(vector<int>& nums, int k) {int L 0, R nums.size() - 1;while (L < R){int left L, right R;int key nums[left];while (left < right){while (left &l…

XX能源云数据平台建设项目_投标书_技术部分(194页word)

标书介绍&#xff1a; 该标书通过物联网技术&#xff0c;实时采集能源行业各类数据&#xff0c;并进行标准化整合。采用分布式存储技术&#xff0c;确保数据的安全性和可扩展性。运用大数据和人工智能技术&#xff0c;对数据进行深度分析和挖掘&#xff0c;提供有价值的业务洞…

鉴权开发框架Django REST framework的应用场景

目录 一、鉴权开发框架介绍二、Django REST framework是什么三、如何实现认证、权限与限流功能四、Django REST framework的应用场景 一、鉴权开发框架介绍 鉴权开发框架是一种用于实现身份验证和授权的软件开发工具。它可以帮助开发者快速构建安全、可靠的身份验证和授权系统…

AI大模型训练过程

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 大模型训练概述 AI大模型训练是指在海量数据中&#xff0c;对拥有数百万至数千万参数及深层次神经网络结构的模型进行训练的过程。这类大模型因其庞大的参数规模和复杂的网…

利用LabVIEW和数字孪生技术实现PCB电路板测试

利用LabVIEW和数字孪生技术对PCB电路板进行测试&#xff0c;可以通过动画展示实现测试过程的生动、形象和直观。本文详细说明了如何结合LabVIEW与数字孪生技术进行PCB电路板的测试&#xff0c;包括系统架构、实现方法以及具体展示效果&#xff0c;适合对外展示。 在现代电子制造…

Redis安装与使用

目录 1、介绍 1、redis的特点: 2、缓存 2、安装Redis 1、安装单机版redis 2、redis-cli命令参数 3、清空数据库的两种方式和作用域&#xff1a; 4、redis的增删查改命令 5、redis的查看所有分类命令 6、redis过期时间与控制键的行为 7、redis的相关工具 1、介绍 r…

如何成为专业的 .NET 开发人员

如今&#xff0c;网上有大量信息&#xff0c;找到正确的信息并非易事。当你开始编程之旅并希望获得全面的指南时&#xff0c;最好寻找一个可以指导你完成整个过程的指南。 本文将帮助您制定一份路线图&#xff0c;告诉您什么是重要的以及什么是需要学习的. 一.一切从软件基础…

CSS|03 尺寸样式属性文本与字体属性

尺寸样式属性 height:元素高度height的值&#xff1a;auto 自动length 使用px定义高度% 基于包含它的块级对象的百分比高度 width&#xff1a;元素的宽度width的值与height一样span标签可以设置宽度、高度吗&#xff1f; 答&#xff1a;不可以&#xff0c;因为span标签是一个行…

机器人控制系列教程之动力学建模(1)

简介 机器人动力学是对机器人机构的力和运动之间关系与平衡进行研究的学科。机器人动力学是以机器人运动为基础&#xff0c;研究在运动过程中连杆与连杆之间、连杆与工件之间力或力矩等关系。 分类&#xff1a; 根据研究方向的不同&#xff0c;机器人的动力学分析也分为正、逆…

华为OD机试 - 掌握单词个数(Java 2024 D卷 100分)

华为OD机试 2024D卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;D卷C卷A卷B卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测…

一文搞懂Linux多线程【下】

目录 &#x1f6a9;多线程代码的健壮性 &#x1f6a9;多线程控制 &#x1f6a9;线程返回值问题 &#x1f6a9;关于Linux线程库 &#x1f6a9;对Linux线程简单的封装 在观看本博客之前&#xff0c;建议大家先看一文搞懂Linux多线程【上】由于上一篇博客篇幅太长&#xff0c;为…

任务5.1 初识Spark Streaming

实战概述&#xff1a;使用Spark Streaming进行词频统计 1. 项目背景与目标 背景: Spark Streaming是Apache Spark的流处理框架&#xff0c;用于构建可伸缩、高吞吐量的实时数据处理应用。目标: 实现一个实时词频统计系统&#xff0c;能够处理流式数据并统计文本中的单词出现频…

网易严选礼品卡有什么用?

网易严选的礼品卡可以在网易商城里买东西 但是现在好多人买东西基本上都用的是淘宝京东之类的 很少会有人用网易吧 但是最近我朋友送了我几张网易的卡&#xff0c;我自己也用积分兑换一张&#xff0c;一直不知道怎么用 最后还是在收卡云上转让出去了&#xff0c;价格高不说…

yolo-world使用自己数据集训练

YOLO-World下载&#xff1a; https://github.com/AILab-CVC/YOLO-World/tree/master 1.数据准备 数据格式COCO格式即可 2.配置文件修改 configs/finetune_coco/yolo_world_v2_l_vlpan_bn_sgd_1e-3_40e_8gpus_finetune_coco.py &#xff08;1&#xff09; 模型下载路径&#xf…

vue3-openlayers 要素聚合(cluster)、icon聚合

本篇介绍一下使用vue3-openlayers 要素聚合&#xff08;cluster&#xff09;&#xff0c;icon聚合 1 需求 要素聚合&#xff08;cluster&#xff09;&#xff0c;icon聚合 2 分析 使用ol-source-cluster 4 实现 <template><ol-map:loadTilesWhileAnimating"…

gin数据解析和绑定

一. Json数据解析和绑定 html文件&#xff1a; <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <meta htt…

Java数据脱敏

数据脱敏 敏感数据在存储过程中为是否为明文, 分为两种 落地脱敏: 存储的都是明文, 返回之前做脱敏处理不落地脱敏: 存储前就脱敏, 使用时解密, 即用户数据进入系统, 脱敏存储到数据库中, 查询时反向解密 落地脱敏 这里指的是数据库中存储的是明文数据, 返回给前端的时候脱…

带货直播部门的薪酬提成还有绩效考核怎么做!

直播带货公司一大片&#xff0c;老板一定要控制好自己利润很好的时候分钱的这个欲望&#xff0c;因为不怕分钱&#xff0c;就怕分错了之后收不回来。举例&#xff1a;你今年赚了 1, 000 万&#xff0c;然后你的运营或者你的投手是不是你感觉他的贡献很大&#xff0c;这时候你就…

时延降低 50%,小红书图数据库如何实现多跳查询性能大幅提升

多跳查询为企业提供了深入的数据洞察和分析能力&#xff0c;它在小红书众多在线业务中扮演重要的角色。然而&#xff0c;这类查询往往很难满足稳定的 P99 时延要求。小红书基础架构存储团队针对这一挑战&#xff0c;基于大规模并行处理&#xff08;MPP&#xff09;的理念&#…

【已解决】Pycharm:卡顿解决方案汇总

可能原因&#xff1a; 1、内存少 2、加载慢 3、文件多 4、硬件老 解决方案&#xff1a; 本机测试在 MAC&#xff0c;Windows、Linux也有相应的设置&#xff0c;请自行查询。 一、调整Pycharm使用内存 Help - Change Memory Settings 二、取消勾选 重复打开上次项目 Pych…