如何编写时区源文件
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 完整的夏威夷时区规则举例
相关文章:

如何编写时区源文件
0、背景 ① 修改TZ环境变量改变时区不能立即生效。要求设置时区后立即生效,只能用修改/etc/localtime方式。 ② 原文作者 Bill Seymour,想要查看原文,点击官网地址https://www.iana.org/time-zones下载 zic 源码,源码目录中的 tz…...

植物大战僵尸杂交版v2.1最新整合版,附PC端+安卓端+iOS端安装包+修改器+安装教程!
嘿,大家好,我是阿星,今天要跟大家聊聊一款游戏,它不是那种让人眼花缭乱的大制作,也不是那种能让人回味无穷的艺术作品,但它在阿星心里,绝对是神作中的佼佼者。没错,它就是《植物大战…...

【5G射频基本架构】
平台框架 平台演进及搭配 5G NR频谱 NSA/SA/ENDC...

4.任务调度
1.基本知识 2.任务的状态 FreeRTOS中任务共存在4种状态:Running 运行态 当任务处于实际运行状态称之为运行态,即CPU的使用权被这个任务占用(同一时间仅一个任务处于运行态)。Ready 就绪态 处于就绪态的任务是指那些能够运行&…...

Github 2024-06-27 Go开源项目日报Top10
根据Github Trendings的统计,今日(2024-06-27统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Go项目10Ollama: 本地大型语言模型设置与运行 创建周期:248 天开发语言:Go协议类型:MIT LicenseStar数量:42421 个Fork数量:2724 次关注人…...

【D3.js in Action 3 精译】1.2.2 可缩放矢量图形(一)
译注 由于 1.2.2 小节介绍 SVG 的篇幅过多,为了方便查阅,后续将分多个小节依次进行翻译。为了确保整个 1.2.2 小节的完整性,特意将上一篇包含的 SVG 小节的内容整理出来重新编排。敬请留意。 1.2.2 SVG - 可缩放矢量图形 可伸缩矢量图形&…...
「C系列」C 排序算法
文章目录 一、C 排序算法二、C 排序算法-应用场景1. 冒泡排序(Bubble Sort)2. 选择排序(Selection Sort)3. 插入排序(Insertion Sort)4. 快速排序(Quick Sort)5. 归并排序࿰…...

Power BI可视化表格矩阵如何保持样式导出数据?
故事背景: 有朋友留言询问:自己从Power BI可视化矩阵表格中导出数据时,导出的表格样式会发生改变,需要线下再手动调整,重新进行透视组合成自己想要的格式。 有没有什么办法让表格导出来跟可视化一样? Po…...

《UDS协议从入门到精通》系列——图解0x35:请求上传
《UDS协议从入门到精通》系列——图解0x35:请求上传 一、简介二、数据包格式2.1 服务请求格式2.2 服务响应格式2.2.1 肯定响应2.2.2 否定响应 三、通信示例 Tip📌:本文描述中但凡涉及到其他UDS服务的,将陆续提供链接跳转方式以便快…...

Tailwindcss 扩展默认配置来自定义颜色
背景 项目里多个Tab标签都需要设置同样的背景颜色#F1F5FF,在集成tailwindcss之前就是重复该样式,如下图: .body {background-color: #f1f5ff; }集成tailwindcss时,我们希望在class中直接设置该背景色,但是默认的tai…...
C++设计模式---享元模式
1、介绍 原理: 享元模式是一种主要用于减少创建对象的数量,以减少内存占用和提高性能的结构型设计模式。它通过共享多个对象所共有的相同状态,使得在有限的内存容量中能够载入更多的对象。具体来说,享元模式将对象的状态分为内部…...

智慧园区大数据云平台建设方案(Word原件)
第一章 项目建设背景及现状 第二章 园区创新发展趋势 第三章 工业园区大数据存在的问题 第四章 智慧工业园区大数据建设目的 第五章 智慧园区总体构架 第六章 系统核心组件 第七章 智慧工业园区大数据平台规划设计 获取方式:本文末个人名片直接获取。 软件资料清单…...

【学习】如何利用Python技术进行软件测试相关工作
Python是一种广泛使用的高级编程语言,它因其简洁的语法、强大的库支持和跨平台特性而受到开发者的喜爱。在软件测试领域,Python同样发挥着重要作用,它可以帮助测试人员编写自动化测试脚本、进行接口测试、性能测试、以及处理测试数据等。以下…...
Qt:3.项目创建、对象树、乱码问题、Qt命名规则
目录 1.创建项目: 2.Qt可以支持两套基础类: 3.节点的父子关系和对象树: 4.QLabel类: 5.乱码问题: 6.Qt命名规则: 1.创建项目: qt的项目中有一个以.ui为后缀的文件,他本质是一个…...

C# 入门—实现 Hello, World!
目录 一、.net 平台 二、.net 都能干什么? 三、.net 两种交互模式 四、使用 VS Code 开发 C# 程序 五、实现 Hello, World! 一、.net 平台 下载 .NET(Linux、macOS 和 Windows) (microsoft.com) .NET 简介 - .NET | Microsoft Learn C# :一种编程语言,可以开…...

【项目实训】前端页面初探索(前期探索)
前期,由于没有确定页面展示形式,于是进行了很多探索 首先安装element-ui 导入elemnt-plus 添加use: 设置一个全局样式 编写导航栏 <el-menu:default-active"activeIndex"class"el-menu-demo"background-color"#95d475&quo…...

机器人控制系列教程之动力学建模(2)
接昨天的推文:https://editor.csdn.net/md/?articleId139991958 ,动力学的求解通常是个相对比较复杂的过程,但现在基本上不用人工来推算求解各种公式和求解过程了,大家只需要知道其中的步骤即可,现代对于动力学问题的…...

Golang | Leetcode Golang题解之第200题岛屿数量
题目: 题解: func numIslands(grid [][]byte) int {res : 0for i : 0; i < len(grid); i {for j : 0; j < len(grid[i]); j {if grid[i][j] 1 {resdfs(grid, i, j)}}}return res }func dfs(grid [][]byte, r, c int) {h, w : len(grid), len(gri…...

Linux系统启动流程
init程序类型: ①、SysV:init,centos 5之前,配置文件/etc/init.d/ ②、Upstart: init,centos 6,配置文件/etc/init.d/ /etc/init/ ③、Systemd:Systemd,centos 7,配置文件/usr/li…...

Vue 学习之 axios
目录 执行安装命令:npm install axios 使用的时候导入 axios以data,params,headers传参方式的区别 axios封装 是一个基于 promise 的 网络请求库,作用于浏览器和 node.js 中。使用Axios可以在前端项目中发送各种方式的HTTP请求…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...

uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...

均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...

R 语言科研绘图第 55 期 --- 网络图-聚类
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...

Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)
引言 工欲善其事,必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后,我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集,就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...