Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails:获取时区偏移量名称_Ruby On Rails_Ruby_Timezone - Fatal编程技术网

Ruby on rails 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:

在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::TimeZone::MAPPING.key('America/Los_Angeles'))
=>“太平洋时间(美国和加拿大)”
但是,我怎样才能得到像
太平洋夏令时
这样的字符串,而不仅仅是
PDT
来表示特定日期的完整时区偏移量名称呢

输入:
America/Los_Angeles
和特定日期或日期时间


所需输出:
Pacific Daylight Time
Short story:~出于某种原因,~(由于@bata的缩写不是唯一的,因此这可能是没有官方缩写的原因,人类友好名称映射)标准似乎不支持它。您可能需要自己实现这个映射。但是,如果你想得到一些提示,请继续读下去,为什么这可能不是那么容易

所以。。。这是一个有趣的兔子洞

使用了哪些宝石,它们从哪里获得信息 这反过来又使用了tz信息宝石<代码>tz信息表示:

  • 类Unix系统中的zoneinfo目录
  • TZInfo::数据
Rails的文件模板

起初,我认为可能会有一个公关机会,为一个受欢迎的宝石做出贡献。没有将
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字符串和类似的内容,并且没有提到提供“友好”名称的可能性
如果您在读取RFC时遇到困难,则
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