在Ruby中,在有ActiveSupport和TZInfo的情况下,我试图解析可以包含时区标识符的任意时间字符串。
[当提供时区作为偏移量(例如'-08:00'
)时处理时区没有问题。两种长名称样式似乎都可以使用(例如'America/Vancouver'
,'Pacific Time (US & Canada)'
),但是常见的缩写和夏令时交替出现,但大多数都失败了,只有少数例外。
查看Wikipedia上的List of time zone abbreviations,有190个不同的缩写。当我用TZInfo::Timezone.get(abbrev)
(其中abbrev
是包含给定缩写字符串的变量,例如'MST'
)测试它们中的每一个时,只能识别9个:CET,EET,EST,GMT,HST,MET,MST ,UTC和WET。
例如:
> TZInfo::Timezone.get('MST')
=> #<TZInfo::DataTimezone: MST>
> TZInfo::Timezone.get('PST')
TZInfo::InvalidTimezoneIdentifier
所以:是否有一种方法可以将大多数或所有常见的3-5个字符的时区缩写转换为TZInfo或ActiveSupport时区?
或者我是否必须编写自己的转换帮助器,以使转换表在全球时区策略变化的情况下保持最新状态?
(我确实认识到缩写不是100%可靠或权威的-特别是在少数情况下,同一缩写指的是具有不同偏移量的多个时区-但我仍然需要做出“最佳猜测” ”,而不是没有。)
tzinfo describes它使用的数据来自:
包含时区定义文件的zoneinfo目录。这些文件是使用zic实用程序从IANA时区数据库生成的。大多数类似Unix的系统都包含一个zoneinfo目录。
TZInfo :: Data库(tzinfo-data gem)。 TZInfo :: Data包含一组Ruby模块,这些模块也是从IANA时区数据库生成的。
时区定义文件通常位于/usr/share/zoneinfo
中。在我的计算机上,此目录中没有任何内容,例如,PMDT
。
tzinfo数据是here,也没有PMDT
。
如果找到一组合适的时区信息定义文件,其中包含要查询的区域,则tzinfo
理论上应该可以使用它们。