关于数据库时区这么多奥秘你都知道么
发布日期:2022-03-28 10:11 点击次数:185
摘要:。2.2 POSIX时区格式不以冒号开始的格式都算此种格式,扩展开来如下,[]里的字段代表是可选的:std offset[dst[offset][,startdate[/time], enddate[/time]]]格式:`std offset[dst[offset][,startdate[/time], enddate[/time]]]`各字段含义如下:1. std && dst 代表标准时区和日光节约制时区,std是必须的,dst是可选的(有dst字段则代表支持夏令时)。这两个字段有两种格式:a. 一种带引用符号<>,引用符号内的字符串可以是字母、数字、+、-,解析时不包含引用符号<>;b. 另一种不带引用符号<>,字符串只能是字母。字段长度大于等于3,小于等于TZNAME_MAX(linux是6),如果字符串长度不符合规定,解析规则未定义(linux不识别)。2. offset 代表本地时间加上多少能得到UTC时间。格式为hh[:mm[:ss]],0<=hh<=24,0<=mm&&ss<=59。hh是必须的,并且可以是1位,mm和ss是可选的。如果前面带了一个加号+,表示本初子午线以西。表示本时间加上多少时间才能得到UTC时间。加号+也可不带。如果前面带了一个减号-,表示本初子午线以东。表示本时间减去多少时间才能得到UTC时间。std后面的offset是必须的,dst后面的offset是可选的,如果没有,则默认比标准时间提前一小时。3. rule 表示什么时候开始夏令时,什么时候结束夏令时,协议没有提到怎么处理没有rule的情况,从linux系统来看,没有rule默认按M3.2.0/02:00:00,M11.1.0/02:00:00处理。格式为date[/time],date[/time]。date有三种形式:a. Jn,1 <= n <= 365,不包括闰年的2月29日;b. n,0 <= n <= 365,包括闰年的2月29日;c. Mm.n.d,m表示哪个月份(1 <= m <= 12),n表示一个月的第几周(1 <= n <= 5),5代表最后一个,d表示一周的第几天(0 <= d <= 6,从周日开始)。4. time 格式与offset相同,除了没有+和-,如果没带time字段,则默认为02:00:00。举例:"UTC-8:00:00DST-09:00:00,M3.2.0/02:00:00,M11.1.0/02:00:00"表示本地时间为UTC以东减8小时,支持夏令时且夏令时为UTC减9小时(及提前一小时),夏令时从3月第2周第0天凌晨2点开始,到11月第1周第0天凌晨2点结束。CST6CDT,M3.2.0/2:00:00,M11.1.0/2:00:00POSIX时区格式由于无法表示不使用公历的时间(比如希腊),因此并未被广泛采用。3 通用时区数据库各地的时区和夏令时规则由各自的政府独立管理,他们经常在有限的通知下进行变更。而且他们历史数据和未来计划也只是断断续续的记录下来。通用时区数据库试图组织和整理这一领域相关的数据。时区数据库,通常称为 tz, tzdata 或 zoneinfo,是一组包含大量代码和数据用来表示全球许多有代表性的地点的本地时间的历史信息,他会根据各个政体对时区边界和夏令时规则的改变而不定期的更新。数据库中每一个条目都代表这自1970年以来被广泛认可的民用时钟的时区信息。该数据库被很多项目引用,比如:the GNU C Library (used in GNU/Linux), Android, FreeBSD, NetBSD, OpenBSD, Chromium OS, Cygwin, MariaDB, MINIX, MySQL, webOS, AIX, BlackBerry 10, iOS, macOS, Microsoft Windows, OpenVMS, Oracle Database, 和 Oracle Solaris。GaussDB同其它广泛使用的软件产品一样,也是采用了IANA维护的通用时区数据。该数据库由David Olson创立,由Paul Eggert进行编辑和维护。因而有些地方也将其称作Olson数据库。它的显著特色是由Paul Eggert设计的一套通用时区命名规则,每个时区按照“区域/位置”格式,得到一个独有的名称,例如“America/New_York”。英文地名中的空格用下划线“_”代替,连词符“-”只在英文地名本身包含时使用。时区数据库目前普遍有两个叫法 Olson时区数据库或IANA时区数据库。奥尔森(Olson)的数据有所变化,部分原因是奥尔森(AD Olson)即将退休,部分原因是针对维护者的版权侵权提起了诉讼(现已撤销)。2011年10月14日,国际互联网名称与名称分配机构(IANA)接管了时区数据库的维护工作。它会定期进行更新以反映各政治实体对时区边界、UTC 差值和夏令时规则的更改。对tz的更新遵循BCP 175流程进行管理。经常有一些国家变更时区规则,IANA每年都会发布最新的时区数据和解析源码库。实际上时区如何定义如何管理是颇具争议的事情,并不存在绝对权威的时区数据库。IANA维护的通用时区数据库由于每条记录都标识了明确的信息来源,有历史信息也能推测未来时间,被GNU C Library,BSD的采用而变的广泛使用。其实还存在其它的时区数据库,例如:微软时区数据库,HP-UX时区数据库,世界时间服务器(https://www.worldtimeserver.com/)和国际航空运输协会的《标准时间表信息手册》等。实战篇1 GaussDB(DWS)时区的使用系统表 pg_timezone_names 记录时区名称。testdb=# select * from pg_timezone_names where utc_offset='08:00:00';
name | abbrev | utc_offset | is_dst
--------------------+--------+------------+--------
Asia/Kuala_Lumpur | +08 | 08:00:00 | f
Asia/Brunei | +08 | 08:00:00 | f
Asia/Makassar | WITA | 08:00:00 | f
Asia/Harbin | CST | 08:00:00 | f
Asia/Ujung_Pandang | WITA | 08:00:00 | f
Asia/Chungking | CST | 08:00:00 | f
Asia/Kuching | +08 | 08:00:00 | f
Asia/Taipei | CST | 08:00:00 | f
Asia/Macau | CST | 08:00:00 | f
Asia/Macao | CST | 08:00:00 | f
Asia/Manila | PST | 08:00:00 | f
Asia/Chongqing | CST | 08:00:00 | f
Asia/Shanghai | CST | 08:00:00 | f
Asia/Choibalsan | +08 | 08:00:00 | f
Asia/Ulaanbaatar | +08 | 08:00:00 | f
Asia/Irkutsk | +08 | 08:00:00 | f
Asia/Ulan_Bator | +08 | 08:00:00 | f
Asia/Hong_Kong | HKT | 08:00:00 | f
Asia/Singapore | +08 | 08:00:00 | f
Australia/West | AWST | 08:00:00 | f
Australia/Perth | AWST | 08:00:00 | f
ROC | CST | 08:00:00 | f
Etc/GMT-8 | +08 | 08:00:00 | f
PRC | CST | 08:00:00 | f
Singapore | +08 | 08:00:00 | f
Antarctica/Casey | +08 | 08:00:00 | f
Hongkong | HKT | 08:00:00 | f
(27 rows)系统表 pg_timezone_abbrevs 记录了时区简称testdb=# select * from pg_timezone_abbrevs where utc_offset='08:00:00';
abbrev | utc_offset | is_dst
--------+------------+--------
AWST | 08:00:00 | f
BNT | 08:00:00 | f
BORT | 08:00:00 | f
CCT | 08:00:00 | f
HKT | 08:00:00 | f
IRKST | 08:00:00 | f
IRKT | 08:00:00 | f
MYT | 08:00:00 | f
PHT | 08:00:00 | f
SGT | 08:00:00 | f
ULAT | 08:00:00 | f
WADT | 08:00:00 | t
(12 rows)通过设置session的环境变量 timezone 可以设置数据库数据入库和查询时的时区。为什么是session级?不用用户设置不同的时区,或者用户忘记之前设置的时区怎么办?答:时间数据入库后数据库管理软件后台都会将时间转换为UTC的0时区时间,用户查询时根据用户设置的时区,再转换为相应时间给用户。因此用户设置的时区不影响数据存储,数据迁移时也不需要关心时区。2 GaussDB(DWS)初始化时如何设定默认时区如果配置文件中未指定时区,则从操作系统当前环境变量 TZ 获取当前操作系统时区,且该时区是数据库内支持的时区,则直接使用操作系统时区。否则,根据操作系统当前时间构造一些日期来评判哪个时区更和操作系统匹配。评判方法:1)从今向后100年内采集一些时间戳首先,探测当前年的一月和七月,这可以快速排除掉大量的不符合时区。其次,探测当前年七月向后100年间的每周,可以有效排除掉夏令时不符合的时区。tnow = time(NULL); //获取1970-01-01 00:00:00 UTC至今所经历过的秒数
tm_val = localtime(&tnow); //将从time()获取的时间戳,转为本地时间的tm结构格式
thisyear = tm_val->tm_year + 1900; //tm_year是自1900年起的年数,所以要加1900
time_needto_test = 0;
//先构造一个当年的1月15日,再调整到当前周的第一天 00:00:00
t = MakeTime(thisyear, 1, 15);
t -= (t % T_WEEK);
test_times[time_needto_test++] = t;
//构造一个当年的7月15日,再调整到当前周的第一天 00:00:00
t = MakeTime(thisyear, 7, 15);
t -= (t % T_WEEK);
test_times[time_needto_test++] = t;
//构造向后100年内每周的时间
while (tt.n_test_times < 52 * 100) {
t -= T_WEEK;
test_times[time_needto_test++] = t;
}
//总共构造了5202个探测时间2)判断每个数据库内部时区与操作系统时区的匹配度如果一个时间戳转为操作系统时区与转为待测试的数据库内部时区后的时间一致,则加一分。遇到一个不匹配则结束当前时区匹配。首先,判断 "/etc/localtime" 中时区与前面测试时间的匹配度,如完全匹配则返回成功。
否则,判断数据库安装目录timezone下的每个时区文件与前面测试时间的匹配度,获取匹配度最高的时区。
bestscore = 0;
for (获取每一个时区文件) {
判断当前时区文件与探测时间的匹配度
score = score_timezone(tzdirsub, tt);
if (score > bestscore) { //当前时区文件匹配度 > 目前最大匹配度
bestscore = score;
bestzonename = tzdirsub;
} else if (score == bestscore) { //如果当前时区文件匹配度与目前最大匹配度相等,则选择长度更短,字母排序更靠前的时区
if ((strlen(tzdirsub) < strlen(bestzonename) ||
(strlen(tzdirsub) == strlen(bestzonename) && strcmp(tzdirsub, bestzonename) < 0))
strlcpy(bestzonename, tzdirsub, TZ_STRLEN_MAX + 1);
}
}3)如果所有数据库内部时区匹配完,最佳得分仍为0,则需要构造一个与操作系统时区一致的POSIX风格的时区,例如:“PSD8PDT”冷知识篇1 我国有哪些时区,都是怎么设置的?公元1912年之前,中国各地并没有统一的标准时间。在封建时代,国家的标准历法由皇庭颁布,而中国传统历法同时依赖于日月两个天体的运动,并以实际天文观测为准,因此历时标准都以朝廷所在地(准确说,是钦天监的观测点)的经纬为准。公元1912年,中华民国建立,首次设立并正式颁布时区划分将中国分为五个时区,并在1939年正式颁布。1:昆仑时区(GMT+5:30)2:新藏时区(GMT+6)3:陇蜀时区(GMT+7)4:中原标准时区(GMT+8)5:长白时区(GMT+8:30)详细介绍如下:Asia/Harbin 也叫长白时区,主要代表黑龙江(不包括漠河),吉林地区的时间# Zone NAME GMTOFF RULES FORMAT [UNTIL]
# Changbai Time ("Long-white Time", Long-white = Heilongjiang area)
# Heilongjiang (except Mohe county), Jilin
Zone Asia/Harbin 8:26:44 - LMT 1928 # or Haerbin
8:30 - CHAT 1932 Mar # Changbai Time
8:00 - CST 1940
9:00 - CHAT 1966 May
8:30 - CHAT 1980 May
8:00 PRC C%sTAsia/Shanghai 也叫中原标准时区# Zhongyuan Time ("Central plain Time")
# most of China
# Milne gives 8:05:56.7; round to nearest.
Zone Asia/Shanghai 8:05:57 - LMT 1928
8:00 Shang C%sT 1949
8:00 PRC C%sTAsia/Chongqing 也叫胧蜀时区,主要代表广西,贵州,海南,宁夏,四川,陕西,云南,甘肃主要部分,内蒙古西部,青海西部,广东的德庆,恩平,开平,罗定,台山,新兴,阳春,阳江,郁南,云浮,为东七区。# Long-shu Time (probably due to Long and Shu being two names of that area)
# Guangxi, Guizhou, Hainan, Ningxia, Sichuan, Shaanxi, and Yunnan;
# most of Gansu; west Inner Mongolia; west Qinghai; and the Guangdong
# counties Deqing, Enping, Kaiping, Luoding, Taishan, Xinxing,
# Yangchun, Yangjiang, Yu'nan, and Yunfu.
Zone Asia/Chongqing 7:06:20 - LMT 1928 # or Chungking
7:00 - LONT 1980 May # Long-shu Time
8:00 PRC C%sTAsia/Urumqi 也叫新藏时区,主要代表甘肃的阿克赛哈族自治县,安西县,敦煌,肃北县,连江县,湛江市等等等。# Xin-zang Time ("Xinjiang-Tibet Time")
# The Gansu counties Aksay, Anxi, Dunhuang, Subei; west Qinghai;
# the Guangdong counties Xuwen, Haikang, Suixi, Lianjiang,
# Zhanjiang, Wuchuan, Huazhou, Gaozhou, Maoming, Dianbai, and Xinyi;
# east Tibet, including Lhasa, Chamdo, Shigaise, Jimsar, Shawan and Hutubi;
# east Xinjiang, including Urumqi, Turpan, Karamay, Korla, Minfeng, Jinghe,
# Wusu, Qiemo, Xinyan, Wulanwusu, Jinghe, Yumin, Tacheng, Tuoli, Emin,
# Shihezi, Changji, Yanqi, Heshuo, Tuokexun, Tulufan, Shanshan, Hami,
# Fukang, Kuitun, Kumukuli, Miquan, Qitai, and Turfan.
Zone Asia/Urumqi 5:50:20 - LMT 1928 # or Urumchi
6:00 - URUT 1980 May # Urumqi Time
8:00 PRC C%sTAsia/Kashgar 也叫昆仑时区,主要代表西藏西部(普兰县,阿合奇县,疏附县,疏勒县),新疆西部(阿克苏,阿图什,伊宁,和田,策勒,洛浦,尼勒克,昭苏,特克斯,巩留,察布查尔,霍城,博乐,皮山,等等等)Zone Asia/Kashgar 5:03:56 - LMT 1928 # or Kashi or Kaxgar
5:30 - KAST 1940 # Kashgar Time
5:00 - KAST 1980 May
8:00 PRC C%sTPRC指向中原标准时区Link Asia/Shanghai PRC1949年中华人民共和国成立,我国废除了原国民政府1939年设立的中原标准时区、昆仑时区、长白时区、陇蜀时区以及新藏时区,在全国统一使用(UTC+8),并命名为北京时间。1950年后,全国除西藏、新疆外全部统一使用北京时间。当时新疆的地方人民代表大会为了方便群众,设定了乌鲁木齐时间:(UTC+6),如北京时间8点,乌鲁木齐时间则是6点。新的时区调整如下:1)Asia/Harbin(长白时区),Asia/Chongqing(陇蜀时区),Asia/Shanghai(中原标准时区)时区名保留,定义都指向新定义的Asia/Shanghai(中国标准时区)。全国统一使用。中原标准时区改名为北京时区,offset有调整# Zone NAME STDOFF RULES FORMAT [UNTIL]
# Beijing time, used throughout China; represented by Shanghai.
Zone Asia/Shanghai 8:05:43 - LMT 1901
8:00 Shang C%sT 1949 May 28
8:00 PRC C%sT2)Asia/Kashgar(昆仑时区),Asia/Urumqi(新藏时区)时区名保留,定义都指向新定义的Asia/Urumqi(乌鲁木齐时区)。当地同时使用两个时区定义。新藏时区改名为新疆时区offset有调整# Xinjiang time, used by many in western China; represented by Ürümqi / Ürümchi
# / Wulumuqi. (Please use Asia/Shanghai if you prefer Beijing time.)
Zone Asia/Urumqi 5:50:20 - LMT 1928
6:00 - +06被合并的时区L Asia/Urumqi Asia/Kashgar 昆仑时区合入新藏时区
L Asia/Shanghai Asia/Harbin 长白时区合入中原标准时区
L Asia/Shanghai Asia/Chongqing 胧蜀时区合入中原标准时区
L Asia/Shanghai Asia/Chungking 胧蜀时区新增别名Chungking,也合入中原标准时区
L Asia/Shanghai PRC2 为什么没有北京时区只有北京时间?由于各种政治原因国家所在地区,国家名称和地区所属国家会时常发生变更,这给时区管理带来很多麻烦。例如:位于非洲东南部的内陆国家“斯威士兰王国”在2018年4月宣布将国名更改为“埃斯瓦蒂尼”;我们绝对熟悉的1997年7月1日,香港从英属殖民地回归到了我们伟大祖国的怀抱,所属国就进行了变更。因此,IANA的策略是对政治变更保持中立性,时区通常不与国家绑定,也并不要求每个国家或国家首都必须具有时区名称。为了国内用户的使用方便,GaussDB(DWS)根据IANA的定义的语法规则,在内部帮助用户定义了 Asia/Beijing 时区,其定义与 PRC 时区定义一致。3 时区定义是一成不变的吗?时区如何定义如何管理是颇具争议的事情,并不存在绝对权威的时区数据库。一个国家或地区的时区信息变更属于独立事务,没有义务必须通知IANA。IANA时区数据库的权威性主要依赖时区数据库维护者对相关国家或地区的了解程度。因此,在IANA的时区定义里记录了时区数据库维护者收集时区信息的来源,有时候并不是很客观。下面是IANA中关于我国时区信息的参照依据。From Guy Harris:
From Bob Devine (1988-01-28): See TIME mag, 1986-02-17 p.52.
From U. S. Naval Observatory (1989-01-19):
From Anthony Fok (2001-12-20): from some Taiwan websites
From Paul Eggert (2006-03-22): Devine's note about Time magazine
From Jesper Norgaard Welen (2006-07-14): http://www.astro.com/atlas
From Paul Eggert (2008-02-11): I just now checked Google News for western news sources
From David Cochrane (2014-03-26): https://content.time.com/time/magazine/article/0,9171,960684,00.html
From Luther Ma (2014-04-22): Guo's report regarding Xinjiang
From Paul Eggert (2014-06-30): http://www.sinkiang.gov.cn/service/ourworking (2014-04-22).
From Paul Eggert (2017-01-05):
Guo Qing-sheng (National Time-Service Center, CAS, Xi'an 710600, China)
(Zhongguo ke ji shi liao, 中国科技史料). 2003;24(1):5-9.
http://oversea.cnki.net/kcms/detail/detail.aspx?filename=ZGKS200301000&dbname=CJFD2003
Guo Qing-sheng (Shaanxi Astronomical Observatory, CAS, Xi'an 710600, China)
An AP article "Shanghai Internat'l Area Little Changed"
From P Chan (2018-05-07):
1986-04-12 http://www.zj.gov.cn/attach/zfgb/198608.pdf p.21-22
1987-02-15 http://www.gov.cn/gongbao/shuju/1987/gwyb198703.pdf p.114
1987-09-09 http://www.gov.cn/gongbao/shuju/1987/gwyb198721.pdf p.709
1992-03-03 http://www.gov.cn/gongbao/shuju/1992/gwyb199205.pdf p.152
http://data.people.com.cn/pic/101p/1988/04/1988041201.jpg可见,2014年前IANA收集中国时区信息的来源还多是在西方的新闻,杂志,台湾的网站等等。2014年之后收集的信息来自中国的西安授时中心,国家门户网址等。此外,因为很多国家的时区信息经常变更,IANA通用时区数据库中的时区数据会经常更新。GaussDB(DWS)作为一个面向全球的通用数据库产品,也会在每次发表新版本时从IANA同步最新的时区信息,确保用户的软件产品保持最新的时区信息。4 为什么我们很少需要关注时区?自从1992年取消夏令时以来,我们的时区信息从未变更过,给我们的生产生活带来了极大的便利。国内用户也不再需要关心时区相关的问题。总结综上,GaussDB(DWS)作为一款面向全球用户的高性能分析型数据库产品,对时区的支持也是符合工业界标准规范的。GaussDB(DWS)中时区的使用简单方便,默认时区的选择也比较科学合理。想了解GuassDB(DWS)更多信息,欢迎微信搜索“GaussDB DWS”关注微信公众号,和您分享最新最全的PB级数仓黑科技~点击关注,第一时间了解华为云新鲜技术~
对于新手们来说棋牌资讯,最好的就是在牌局刚刚开始,确定自己全部的手牌的时候就对全局有一个大概的规划。这样做一是可以去试探一下下家会不会吃这些类型的牌,二是可以掌握游戏的主动权,根据下家的跟牌情况推测下家的牌型以及本场牌局的出牌策略。且不论下家打出了什么样的牌,你都会有很大的盯张范围,比如说已经打过了四万,那么此时一万和七万就在可以打出的范围里面了。这样的方法也许有时候会失算棋牌资讯,但对于刚刚接触麻将的新手们来说,这已经是最优的算牌策略了,在很大的程度上保证了算牌的成功率。
- 上一篇:棋牌资讯 赔率的基本条件是概率
- 下一篇:棋牌资讯 500W的梦你每天都买彩票