合肥的网站建设公司哪家好,下述不属于网页制作工具,同城购物网站建设,wordpress缓存文件概念介绍
常说的 Linux 系统时钟有两个 一个是硬件时钟#xff08;RTC#xff09;#xff0c;即BIOS时间#xff0c;一般保存的是 GMT0 时间#xff0c;没时区、夏令时的概念 一个是当地时钟#xff08;LTC#xff09;#xff0c;即我们日常经常看到的时间#xff0…概念介绍
常说的 Linux 系统时钟有两个 一个是硬件时钟RTC即BIOS时间一般保存的是 GMT0 时间没时区、夏令时的概念 一个是当地时钟LTC即我们日常经常看到的时间比如 date 命令获取的时间一般是在 GMT 时间的基础上增加或者减去 0 ~ 12 小时
世界标准时间 (UTC)
Coordinated Universal Time协调世界时又称世界标准时间或世界协调时间是最主要的世界时间标准其以原子时秒长为基础在时刻上尽量接近于格林尼治标准时间
格林尼治标准时间 (GMT)
Greenwich MeanTime格林尼治时间又称格林尼治平均时间或格林尼治标准时间旧译格林威治标准时间GMT 是指位于英国伦敦郊区的皇家格林尼治天文台的标准时间因为本初子午线被定义在通过那里的经线。英国伦敦格林尼治定为 0° 经线开始的地方地球每 15° 经度就被分为一个时区共分为 24 个时区相邻时区相差一小时例中国北京位于东八区GMT 时间比北京时间慢 8 小时
补充UTC 基本上等于 GMT世界上所有国家的时间都是以此时间为基准
夏令时 (DST)
Daylight Saving Time是一种为节约能源而人为规定地方时间的制度在这一制度实行期间所采用的统一时间称为夏令时间
一般在天亮早的夏季人为将时间调快一小时可以使人早起早睡减少照明量以充分利用光照资源从而节约照明用电。各个采纳夏令时的国家具体规定不同。目前全世界有近110个国家每年要实行夏令时
我国也曾经实行过夏令时在1986年开始实行取得了相当大的成效每年省电相当于3个三峡但是在6年后的1991年考虑到多方面的因素最终选择了取消这一制度。夏令时在中国实行了6年便停止实行其实停止实行的原因一言蔽之就是中国太大了。中国和英法等国相比有两点最大的不同一是国土面积不同二是气候不同
设置时间
设置系统时间
/etc/localtime 这个文件是用来设置系统的时区的将 /usr/share/zoneinfo/ 中相应的时区文件拷贝覆盖 /etc/localtime即可修改时区设置也可以通过软连接实现这种修改对 date 命令是及时生效的
不论是 date 还是 hwclock 都会用到这个文件会根据这个文件的时区设置来进行 UTC 和本地时间的换算
设置完时区之后可以通过 date 命令来设置系统时间
设置硬件时间
设置完系统时间后硬件 RTC 时间并没有变更如果发生重启系统时间又会恢复到原来的值所以这里需要将系统时钟同步到 RTC 硬件中
通过 hwclock 命令可以完成相关的设置
世界时区代表
先来看一下不带夏令时的时区文件代表
时区地区代表时区文件GMT-12:00International Date Line West国际日期变更线Etc/GMT12GMT-11:00Midway Island, Samoa萨摩亚时间Etc/GMT11GMT-10:00Hawaii夏威夷阿留申时间Etc/GMT10GMT-09:30Marquesas马克萨斯时间Etc/GMT9.30 **GMT-09:00Alaska阿拉斯加时间Etc/GMT9GMT-08:00Pacific Time (US Canada)太平洋时间Etc/GMT8GMT-07:00Arizona, Mountain America北美山地时间Etc/GMT7GMT-06:00Central America北美中部时间Etc/GMT6GMT-05:00Eastern Time (US Canada)北美东部时间Etc/GMT5GMT-04:00Atlantic Time (Canada)大西洋时间Etc/GMT4GMT-03:30Newfoundland纽芬兰时间Etc/GMT3.30 **GMT-03:00Brasilia巴西利亚时间Etc/GMT3GMT-02:00Mid-Atlantic大西洋中部时间Etc/GMT2GMT-01:00Azores亚速尔群岛时间Etc/GMT1GMT00:00Greenwich Mean Time : Dublin, Edinburgh, Lisbon, London格林尼治时间Etc/GMTEtc/GMT0Etc/GMT-0Etc/GMT0GMT01:00Amsterdam, Berlin, Bern,Rome, Stockholm, Vienna欧洲中部时间Etc/GMT-1GMT02:00Jerusalem以色列时间Etc/GMT-2GMT03:00Moscow, St. Petersburg, Volgograd莫斯科时间Etc/GMT-3GMT03:30Tehran伊朗时间Etc/GMT-3.30 **GMT04:00Abu Dhabi, Muscat海湾时间Etc/GMT-4GMT04:30Kabul阿富汗时间Etc/GMT-4.30 **GMT05:00Islamabad, Karachi, Tashkent巴基斯坦时间Etc/GMT-5GMT05:30Chennai, Kolkata, Mumbai, New Delhi印度时间Etc/GMT-5.30 **GMT05:45Kathmandu尼泊尔时间Etc/GMT-5.45 **GMT06:00Astana, Dhaka孟加拉国时间Etc/GMT-6GMT06:30Yangon (Rangoon)缅甸时间Etc/GMT-6.30 **GMT07:00Bangkok, Hanoi, Jakarta印度支那时间Etc/GMT-7GMT08:00Beijing, Chongqing, Hong Kong, Urumqi中国时间Etc/GMT-8GMT08:30Pyongyang平壤时间Etc/GMT-8.30 **GMT08:45Eucla澳大利亚中部西部时间Etc/GMT-8.45 **GMT09:00Osaka, Sapporo, Tokyo日本时间Etc/GMT-9GMT09:30Adelaide澳大利亚中央时间Etc/GMT-9.30 **GMT10:00Canberra, Melbourne, Sydney澳大利亚东部时间Etc/GMT-10GMT10:30Lord Howe Island豪勋爵时间Etc/GMT-10.30 **GMT11:00Magadan, Solomon Is., New Caledonia所罗门群岛时间Etc/GMT-11GMT12:00Fiji, Kamchatka, Marshall Is.斐济时间新西兰时间Etc/GMT-12GMT12:45Chatham Is.查塔姆岛标准时间Etc/GMT-12.45 **GMT13:00Nuku’alofa汤加时间Etc/GMT-13GMT14:00Christmas Island莱恩群岛时间Etc/GMT-14
注意
带 ** 号的表示默认不存在该时区文件需自定义详见后文的《自定义时区文件》章节表里说的时区文件路径前缀都是 /usr/share/zoneinfo/
再来看一下带夏令时的时区文件代表
时区地区代表时区文件GMT-12:00International Date Line West国际日期变更线N/AGMT-11:00Midway Island, Samoa萨摩亚时间N/AGMT-10:00Hawaii夏威夷阿留申时间America/AdakGMT-09:30Marquesas马克萨斯时间N/AGMT-09:00Alaska阿拉斯加时间America/AnchorageGMT-08:00Pacific Time (US Canada)太平洋时间America/Los_AngelesGMT-07:00Arizona, Mountain America北美山地时间America/DenverGMT-06:00Central America北美中部时间America/ChicagoGMT-05:00Eastern Time (US Canada)北美东部时间America/New_YorkGMT-04:00Atlantic Time (Canada)大西洋时间America/HalifaxGMT-03:30Newfoundland纽芬兰时间America/St_JohnsGMT-03:00Brasilia巴西利亚时间皮埃尔和密克隆群岛时间America/Sao_PauloAmerica/MiquelonGMT-02:00Mid-Atlantic大西洋中部时间N/AGMT-01:00Azores亚速尔群岛时间Atlantic/AzoresGMT00:00Greenwich Mean Time : Dublin, Edinburgh, Lisbon, London格林尼治时间Europe/LondonGMT01:00Amsterdam, Berlin, Bern,Rome, Stockholm, Vienna欧洲中部时间Europe/AmsterdamGMT02:00Jerusalem以色列时间欧洲东部时间Asia/JerusalemEurope/KievGMT03:00Moscow, St. Petersburg, Volgograd莫斯科时间N/AGMT03:30Tehran伊朗时间Asia/TehranGMT04:00Abu Dhabi, Muscat海湾时间N/AGMT04:30Kabul阿富汗时间N/AGMT05:00Islamabad, Karachi, Tashkent巴基斯坦时间N/AGMT05:30Chennai, Kolkata, Mumbai, New Delhi印度时间N/AGMT05:45Kathmandu尼泊尔时间N/AGMT06:00Astana, Dhaka孟加拉国时间N/AGMT06:30Yangon (Rangoon)缅甸时间N/AGMT07:00Bangkok, Hanoi, Jakarta印度支那时间N/AGMT08:00Beijing, Chongqing, Hong Kong, Urumqi中国时间N/AGMT08:30Pyongyang平壤时间N/AGMT08:45Eucla澳大利亚中部西部时间N/AGMT09:00Osaka, Sapporo, Tokyo日本时间N/AGMT09:30Adelaide澳大利亚中央时间Australia/AdelaideGMT10:00Canberra, Melbourne, Sydney澳大利亚东部时间Australia/MelbourneGMT10:30Lord Howe Island豪勋爵时间Australia/Lord_HoweGMT11:00Magadan, Solomon Is., New Caledonia所罗门群岛时间N/AGMT12:00Fiji, Kamchatka, Marshall Is.斐济时间新西兰时间Pacific/AucklandGMT12:45Chatham Is.查塔姆岛标准时间Pacific/ChathamGMT13:00Nuku’alofa汤加时间N/AGMT14:00Christmas Island莱恩群岛时间N/A
注意
N/A表示该地区没有夏令时表里说的时区文件路径前缀都是 /usr/share/zoneinfo/
工具介绍
常用的工具
zdump以文本展示某个时区变化历史的工具zic时区编译器可将时区定义的文本文件编译成二进制时区文件
这两个工具在 Ubuntu 18.04 的机器上默认就有
编译
去官网https://www.iana.org/time-zones 下载最新的 timezone 压缩包 在 Ubuntu 18.04 的机器上执行如下步骤开始编译
lzip -d tzdb-2022g.tar.lz
tar -xf tzdb-2022g.tar
mkdir out
cd tzdb-2022g/
# TOPDIR 指定目录安装否则会安装到系统的 /usr/share/zoneinfo/ 目录下
make TOPDIR$PWD/../out install编译完成后的安装目录结构如下 zdump
cd ../out/usr/bin/
./zdump -v ../share/zoneinfo/America/Los_Angeles
# 报错说: No such file or directory
# 使用 strace 来跟踪看看哪里出了问题
strace ./zdump -v ../share/zoneinfo/America/Los_Angeles
# 发现是 zdump 默认会把 $TOPDIR/usr/share/zoneinfo/ 带进来
# 所以我们只需要带 America/Los_Angeles 就可以了
./zdump -v America/Los_Angeles
# 就可以看到夏令时相关的信息啦strace 真有用# 后来研读 zdump.c 的代码发现绝对路径也可以第一个字符要是/
./zdump -v /home/xxx/out/usr/share/zoneinfo/America/Los_Angeleszic
# 回到 tzdb-2022g 目录当前目录就有之前编译生成的 zdump/zic 工具
# 新建个目录拿北美这个文本文件编译一下生成二进制时区文件
mkdir my_tz_file
./zic -d ./my_tz_file/ northamerica
# 生成的二进制时区文件都在这个新建的文件夹里了
# 再用 zdump 试一下
./zdump -v /home/xxx/tzdb-2022g/my_tz_file/America/Los_Angeles
# 也是没问题的但有一点疑惑
# 我们自己生成的 Los_Angeles 文件文件大小跟系统的有出入
ls -lh ./my_tz_file/America/Los_Angeles
# 1.3K
ls -lh /usr/share/zoneinfo/America/Los_Angeles
# 2.8K# 仔细看 zic 的说明文档才发现如果要跟系统的文件一样大需要加 -b fat 参数
./zic -b fat -d ./my_tz_file/ northamerica
# 据说这个可以兼容老版本自定义时区文件
由于实际需求Linux 系统自带的时区文件无法满足需要上面介绍的世界时区是带夏令时规则的如果我们不想考虑夏令时可以使用 /usr/share/zoneinfo/Etc 目录下的时区文件但是发现该目录缺少了一些非整数的时区文件
从上面介绍的世界时区代表可知世界上存在着一些特殊的非整数时区罗列如下
GMT-09:30GMT-03:30GMT03:30GMT04:30GMT05:30GMT05:45GMT06:30GMT08:30GMT08:45GMT09:30GMT10:30GMT12:45
所以需要我们手动编辑 tzdb-2022g 目录下的 etcetera 文本文件添加一段如下红框部分
需要注意的是文本文件最后需要一行空白行结尾 再用 zic 编辑器生成对应的时区文件就可以拿去用啦
mkdir my_tz_file_etc
./zic -b fat -d ./my_tz_file_etc/ etcetera参考
https://blog.csdn.net/weixin_42099906/article/details/116556736
https://blog.csdn.net/q793145253/article/details/127152917
https://www.modb.pro/db/575850
https://www.cnbiancheng.com/?p1631
https://www.iana.org/time-zones
http://www.shijian.cc/shiqu/ - - 可以对照时间验证设置的时区文件准不准