Ruby strftime'%Z'方法返回'0545'而不是'NPT'

时间:2017-04-26 09:22:27

标签: ruby-on-rails ruby macos

将MacOS升级到最新版本后,我对Time#strftime方法有一些奇怪的问题。

Time.now.in_time_zone("Kathmandu").strftime("%Z") #=> '+0545'
Time.now.in_time_zone("Bangkok").strftime("%Z") #=> '+07'
Time.now.in_time_zone("Nairobi").strftime("%Z") #=> 'EAT'
Time.now.in_time_zone("New Delhi").strftime("%Z") #=> 'IST'

我目前的红宝石版本是:

ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-darwin16]

我试过了:

ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin16]

仍然无法正常工作

我在我朋友的机器上试过这个(ruby 2.4.1p111(2017-03-22修订版58053)[x86_64-darwin15])并且工作正常。

Time.now.in_time_zone("Kathmandu").strftime("%Z") #=> 'NPT'
Time.now.in_time_zone("Bangkok").strftime("%Z") #=> 'ICT'
Time.now.in_time_zone("Nairobi").strftime("%Z") #=> 'EAT'
Time.now.in_time_zone("New Delhi").strftime("%Z") #=> 'IST'

2 个答案:

答案 0 :(得分:4)

ruby​​中的时区方法完全取决于操作系统中安装的 IANA tz database 。您在计算机和朋友的计算机之间观察到的差异只是反映了您将tz数据库升级到较新版本以及操作系统升级的事实。

事实上,IANA正在努力删除部分时区缩写。他们正在删除那些被认为是“发明”的缩写,即由IANA工作人员集中命名,而不是对应于适当地区的任何实际使用情况。另请参阅以下official IANA statement

  

字母时区缩写不应用作UTC偏移的唯一标识符,因为它们在实践中不明确。例如,在说英语的北美" CST"表示比UTC早6小时,但在中国它比UTC早8小时,讲法语的北美人更喜欢" HNC"到" CST"。 tz数据库包含许多时间戳的英文缩写; 遗憾的是,这些缩写中的一些仅仅是数据库维护人员。发明,并逐渐被删除

例如,加德满都的缩写已于2017年1月专门删除,this commit

所以,我猜你应该坚持strftime给你的输出,并实际使用某些时区的数值。

答案 1 :(得分:0)

您可以创建一个将数字时区偏移量转移到缩写名称的转换器。定义一个像

这样的哈希常量
{
... 
'+0200' => 'CEST',
'+0530' => 'IST',
...
} 

List complet