如何以与Java相同的方式从Ruby获取本地时区名称?

问题描述:

我需要从Ruby中找出本地机器时区名称(来自TZInfo :: Timezone.all_identifiers值列表)。我需要它,以便我可以正确设置Oracle数据库会话时区,以便可以正确处理数据库中时区值的时间戳。如何以与Java相同的方式从Ruby获取本地时区名称?

我想要获得与使用java.util.TimeZone.getDefault()。getID()(在我的计算机上返回“Europe/Riga”)的Java相同的值。就我所看到的JDK源代码而言,有特定于平台的C函数可以找到这个默认时区。

所以当使用JRuby时,我可以调用这个Java方法。但是我需要一个可以用于MRI的解决方案。

我试图使用Time.now.zone,但它返回不同的结果(在我的情况下“EET”或“EEST”),取决于当前是否夏令时。所以我真的需要得到前面提到的位置格式(比如“Europe/Riga”),它正确指定了切换到夏令时的日期。

有什么建议吗?

由于兼容性原因,JRuby返回EET/CDT-like值,因为C-Ruby的确如此。但是,因为JRuby中可以很容易地调用Java层,你可以称它像达:

require 'java' 
id = java.util.TimeZone.getDefault().getID() 

,或者在更多的Ruby的语法:

require 'java' 
id = java.util.TimeZone.get_default.get_id 

或者,你可以使用JodaTime:

require 'java' 
id = org.joda.time.DateTimeZone.getDefault.getID 
+2

是的,在JRuby中很简单。但我想在MRI中得到相同的结果(原始的基于C的Ruby解释器)。 – 2009-11-03 09:38:04

+0

我不认为MRI没有办法做到这一点,没有一些技巧或本地电话。在Linux上,很简单,只需“cat/etc/timezone”。 – vsizikov 2009-11-03 12:59:28