当前位置: 首页 > news >正文

如何编写时区源文件

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环境变量改变时区不能立即生效。要求设置时区后立即生效&#xff0c;只能用修改/etc/localtime方式。 ② 原文作者 Bill Seymour&#xff0c;想要查看原文&#xff0c;点击官网地址https://www.iana.org/time-zones下载 zic 源码&#xff0c;源码目录中的 tz…...

植物大战僵尸杂交版v2.1最新整合版,附PC端+安卓端+iOS端安装包+修改器+安装教程!

嘿&#xff0c;大家好&#xff0c;我是阿星&#xff0c;今天要跟大家聊聊一款游戏&#xff0c;它不是那种让人眼花缭乱的大制作&#xff0c;也不是那种能让人回味无穷的艺术作品&#xff0c;但它在阿星心里&#xff0c;绝对是神作中的佼佼者。没错&#xff0c;它就是《植物大战…...

【5G射频基本架构】

平台框架 平台演进及搭配 5G NR频谱 NSA/SA/ENDC...

4.任务调度

1.基本知识 2.任务的状态 FreeRTOS中任务共存在4种状态&#xff1a;Running 运行态 当任务处于实际运行状态称之为运行态&#xff0c;即CPU的使用权被这个任务占用&#xff08;同一时间仅一个任务处于运行态&#xff09;。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 的篇幅过多&#xff0c;为了方便查阅&#xff0c;后续将分多个小节依次进行翻译。为了确保整个 1.2.2 小节的完整性&#xff0c;特意将上一篇包含的 SVG 小节的内容整理出来重新编排。敬请留意。 1.2.2 SVG - 可缩放矢量图形 可伸缩矢量图形&…...

「C系列」C 排序算法

文章目录 一、C 排序算法二、C 排序算法-应用场景1. 冒泡排序&#xff08;Bubble Sort&#xff09;2. 选择排序&#xff08;Selection Sort&#xff09;3. 插入排序&#xff08;Insertion Sort&#xff09;4. 快速排序&#xff08;Quick Sort&#xff09;5. 归并排序&#xff0…...

Power BI可视化表格矩阵如何保持样式导出数据?

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

《UDS协议从入门到精通》系列——图解0x35:请求上传

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

Tailwindcss 扩展默认配置来自定义颜色

背景 项目里多个Tab标签都需要设置同样的背景颜色#F1F5FF&#xff0c;在集成tailwindcss之前就是重复该样式&#xff0c;如下图&#xff1a; .body {background-color: #f1f5ff; }集成tailwindcss时&#xff0c;我们希望在class中直接设置该背景色&#xff0c;但是默认的tai…...

C++设计模式---享元模式

1、介绍 原理&#xff1a; 享元模式是一种主要用于减少创建对象的数量&#xff0c;以减少内存占用和提高性能的结构型设计模式。它通过共享多个对象所共有的相同状态&#xff0c;使得在有限的内存容量中能够载入更多的对象。具体来说&#xff0c;享元模式将对象的状态分为内部…...

智慧园区大数据云平台建设方案(Word原件)

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

【学习】如何利用Python技术进行软件测试相关工作

Python是一种广泛使用的高级编程语言&#xff0c;它因其简洁的语法、强大的库支持和跨平台特性而受到开发者的喜爱。在软件测试领域&#xff0c;Python同样发挥着重要作用&#xff0c;它可以帮助测试人员编写自动化测试脚本、进行接口测试、性能测试、以及处理测试数据等。以下…...

Qt:3.项目创建、对象树、乱码问题、Qt命名规则

目录 1.创建项目&#xff1a; 2.Qt可以支持两套基础类&#xff1a; 3.节点的父子关系和对象树&#xff1a; 4.QLabel类&#xff1a; 5.乱码问题&#xff1a; 6.Qt命名规则&#xff1a; 1.创建项目&#xff1a; qt的项目中有一个以.ui为后缀的文件&#xff0c;他本质是一个…...

C# 入门—实现 Hello, World!

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

【项目实训】前端页面初探索(前期探索)

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

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

接昨天的推文&#xff1a;https://editor.csdn.net/md/?articleId139991958 &#xff0c;动力学的求解通常是个相对比较复杂的过程&#xff0c;但现在基本上不用人工来推算求解各种公式和求解过程了&#xff0c;大家只需要知道其中的步骤即可&#xff0c;现代对于动力学问题的…...

Golang | Leetcode Golang题解之第200题岛屿数量

题目&#xff1a; 题解&#xff1a; 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程序类型&#xff1a; ①、SysV&#xff1a;init&#xff0c;centos 5之前&#xff0c;配置文件/etc/init.d/ ②、Upstart: init&#xff0c;centos 6&#xff0c;配置文件/etc/init.d/ /etc/init/ ③、Systemd:Systemd&#xff0c;centos 7&#xff0c;配置文件/usr/li…...

Vue 学习之 axios

目录 执行安装命令&#xff1a;npm install axios 使用的时候导入 axios以data&#xff0c;params&#xff0c;headers传参方式的区别 axios封装 是一个基于 promise 的 网络请求库&#xff0c;作用于浏览器和 node.js 中。使用Axios可以在前端项目中发送各种方式的HTTP请求…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章&#xff0c;二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑&#xff1a; &#x1f504; 一、起源与初创期&#xff1a;Swagger的诞生&#xff08;2010-2014&#xff09; 核心…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

rnn判断string中第一次出现a的下标

# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

JavaScript基础-API 和 Web API

在学习JavaScript的过程中&#xff0c;理解API&#xff08;应用程序接口&#xff09;和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能&#xff0c;使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

深入浅出Diffusion模型:从原理到实践的全方位教程

I. 引言&#xff1a;生成式AI的黎明 – Diffusion模型是什么&#xff1f; 近年来&#xff0c;生成式人工智能&#xff08;Generative AI&#xff09;领域取得了爆炸性的进展&#xff0c;模型能够根据简单的文本提示创作出逼真的图像、连贯的文本&#xff0c;乃至更多令人惊叹的…...

面试高频问题

文章目录 &#x1f680; 消息队列核心技术揭秘&#xff1a;从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"&#xff1f;性能背后的秘密1.1 顺序写入与零拷贝&#xff1a;性能的双引擎1.2 分区并行&#xff1a;数据的"八车道高速公路"1.3 页缓存与批量处理…...

在golang中如何将已安装的依赖降级处理,比如:将 go-ansible/v2@v2.2.0 更换为 go-ansible/@v1.1.7

在 Go 项目中降级 go-ansible 从 v2.2.0 到 v1.1.7 具体步骤&#xff1a; 第一步&#xff1a; 修改 go.mod 文件 // 原 v2 版本声明 require github.com/apenella/go-ansible/v2 v2.2.0 替换为&#xff1a; // 改为 v…...