Ruby on rails Rails:获取时区偏移量名称
在Ruby或Rails中,给定一个时区标识符,如Ruby on rails Rails:获取时区偏移量名称,ruby-on-rails,ruby,timezone,Ruby On Rails,Ruby,Timezone,在Ruby或Rails中,给定一个时区标识符,如America/Los_Angeles,我知道如何获得特定的时区偏移缩写,如PDT: Time.current.in_时区('America/Los_Angeles').zone =>“PDT” Time.now.in_时区(“美国/洛杉矶”).strftime(“%Z”) =>“PDT” Time.now.in_时区(“美国/洛杉矶”).strftime(“%z”) => "-0700" 甚至是时区本身的友好名称: ActiveSupport:
America/Los_Angeles
,我知道如何获得特定的时区偏移缩写,如PDT:
Time.current.in_时区('America/Los_Angeles').zone
=>“PDT”
Time.now.in_时区(“美国/洛杉矶”).strftime(“%Z”)
=>“PDT”
Time.now.in_时区(“美国/洛杉矶”).strftime(“%z”)
=> "-0700"
甚至是时区本身的友好名称:
ActiveSupport::TimeZone::MAPPING.key('America/Los_Angeles'))
=>“太平洋时间(美国和加拿大)”
但是,我怎样才能得到像太平洋夏令时
这样的字符串,而不仅仅是PDT
来表示特定日期的完整时区偏移量名称呢
输入:America/Los_Angeles
和特定日期或日期时间
所需输出:
Pacific Daylight Time
Short story:~出于某种原因,~(由于@bata的缩写不是唯一的,因此这可能是没有官方缩写的原因,人类友好名称映射)标准似乎不支持它。您可能需要自己实现这个映射。但是,如果你想得到一些提示,请继续读下去,为什么这可能不是那么容易
所以。。。这是一个有趣的兔子洞
使用了哪些宝石,它们从哪里获得信息
这反过来又使用了tz信息宝石<代码>tz信息表示:
- 类Unix系统中的zoneinfo目录
- TZInfo::数据
PDT
映射到任何“人性友好的形式”
查看unix
的zoneinfo
数据库
看起来像一个二进制文件
$ strings /usr/share/zoneinfo/America/Los_Angeles
TZif2
v+ !
2s$
3Gt 4S
5'V 62
mvG n
oV) p
TZif2
v+
3Gt
5'V
mvG
oV)
PST8PDT,M3.2.0,M11.1.0
嗯,不管这些是什么意思,这个词似乎没有“人性化”的名字
对于unix tzinfo
格式进行更多挖掘,显然有一个zic
和zdump
工具
$ zdump /usr/share/zoneinfo/America/Los_Angeles
/usr/share/zoneinfo/America/Los_Angeles Thu Sep 10 03:07:49 2020 PDT
不是很有用
$ zic /usr/share/zoneinfo/America/Los_Angeles
"/usr/share/zoneinfo/America/Los_Angeles", line 1: line too long
啊
但是阅读其中一个工具的manpages
,我发现timezoneinfo
是官方的RFC8536。我不擅长阅读这些,但在格式上有标题(只有版本)和
- (查看它,显然它存储了TZ的所有历史更改)
- 它似乎包含PDT字符串和类似的内容,并且没有提到提供“友好”名称的可能性
tzinfo数据
gem会尝试为不包括tzinfo
数据库(即Windows)的系统复制相同的数据:
时区“美国/洛杉矶”do|tz|
tz偏移量:o0,-28378,0,:LMT
tz偏移量:o1,-28800,0,:PST
tz.偏移量:o2,-28800,3600,:PDT
tz偏移量:o3,-28800,3600,:PWT
tz.偏移量:o4,-28800,3600,:PPT
tz.Transition1883,11,:o1,-2717640000,7227400,3
tz.transition 1918,3,:o2,-163326960029060207,12
tz.transition 1918,10,:o1,-161512920019375151,8
tz.transition 1919,3,:o2,-1601820000,29064575,12
tz.transition 1919,10,:o1,-158367960019378063,8
tz.过渡1942,2,:o3,-880207200,29164799,12
# ... [切!]
下面是offset
方法定义:(至少我认为是这样,在ruby中运行代码之前,您永远不会知道)
如您所见,夏令时没有缩写
这里是转换方法
您可以自行探索更多内容。但是看起来,从DST到DST的每一次转换都应该出现在tzinfo
中。洛杉矶似乎在2060年前都有计划。如果你试图计算2060年后的时间,你会发现与DST相关的TZ错误,这真的很有趣吗
最后一件事:缩写
不知道unix的tzinfo
db是否是这种情况,但是在gem中它们是本地定义的
如果所有定义()
但是请注意
- lib/tzinfo/data/definitions/Asia/Manila.rb定义了正偏移量
- lib/tzinfo/data/definitions/America/Dawson.rb定义了负偏移量
tz.offset:o7,-28800,3600,:PDT
,具有相同的缩写
这是什么意思?不知道。但这可能是我们没有“全球友好时区名称”的原因
数据库中可能有错误。自述文件说:
该历史当地时间信息数据库有几个目标:
- 提供一份关于民间时间历史的数据概要
即使不是100%准确,也很有用
- 了解已经存在的各种当地时间规则
在过去,因此在未来可能会发生
- 测试本地时间规则描述系统的通用性
时区数据文件中的信息绝不具有权威性;
欢迎修复和增强。请看文件
详情请参阅
我认为缩写词没有标准。此外,它们并不像您在这里看到的那样独特:AFAIK目前没有办法获得完整的区域形式。您可能需要添加自己的逻辑来完成此操作。-可用全名缩写区域列表这个问题根本不是关于缩写。
$ zic /usr/share/zoneinfo/America/Los_Angeles
"/usr/share/zoneinfo/America/Los_Angeles", line 1: line too long