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

在将我的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版本是:

 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' 

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

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

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

例如,2017年1月已经专门删除了加德满都的缩写。

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

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

 { ... '+0200' => 'CEST', '+0530' => 'IST', ... } 

列表complet