TZInfo使用IANA时区数据库(www.iana.org/time-zones),在不同时区的时间之间提供夏令时感知转换。这是与用于Unix机器上的zoneinfo是相同的数据库。
时区数据库已经导入(使用TZDataParser),并变成一组Ruby模块(与此版本一起打包)。
以下代码将获取纽约时区(作为TZInfo::Timezone的实例)并将UTC时间转换为纽约当地时间:
require 'tzinfo' tz = TZInfo::Timezone.get('America/New_York') local = tz.utc_to_local(Time.utc(2005,8,29,15,35,0))
注意,返回的时间的时区信息时UTC(local.zone将返回"UTC")。这是因为Ruby的Time类仅支持两个时区:UTC和当前系统本地时区。但返回的时间加上了时区的偏移值。
从本地时间转换为UTC,这local_to_utc方法可以用。
utc = tz.local_to_utc(local)
注意,传入时间的时区将被忽略。以下两行将返回相同的结果,忽略时区信息:
tz.local_to_utc(Time.local(2006,6,26,1,0,0)) tz.local_to_utc(Time.utc(2006,6,26,1,0,0))
要获取有关特定UTC或本地时间生效的规则信息,可以使用Timezone.period_for_utc和Timezone.period_for_local方法。这两个方法都返回TimezonePeriod对象。以下获取时间(本例为EDT)的标识符:
period = tz.period_for_utc(DateTime.new(2005,8,29,15,35,0)) id = period.zone_identifier
在上面的例子中, Time实例可以替换为DateTime实例。Timezone#utc_to_local和Timezone#local_to_utc都返回传递的实例类型,(传递Time返回Time, 传递DateTime返回DateTime)。
你可以通过Timezone#now获得本地当前时间。
now = tz.now
TZInfo中需要的一些时间的所有方法都可以与Time, DateTime或Integers(Time#to_i)一起使用。返回类型与传入的类型相同。
你还可以按时区访问不同国家。以下获取美国的时区信息:
us = TZInfo::Country.get('US') timezones = us.zone_identifiers
zone_info方法提供了国家时区的位置与信息。以上涵盖了最常用的时区和国家。更多细节,请参见各个类的API文档。
API文档,请参见 RubyDoc.info(http://rubydoc.info/gems/tzinfo/frames).