Ruby on Rails运行时判断太平洋时区应使用PST还是PDT
Rails环境下自动适配PST/PDT的DateTime创建方案
不用手动判断PST还是PDT,Rails已经内置了完整的时区规则支持,直接用以下两种更可靠的方式处理:
方法一:直接转换为太平洋时区
创建DateTime对象后,调用in_time_zone方法并传入太平洋时区的标准标识符,Rails会自动根据日期判断是PST还是PDT:
# 生成指定时间的DateTime对象,并转换为太平洋时区 datetime = DateTime.new(2012, 11, 17, 3, 2, 0).in_time_zone('Pacific Time (US & Canada)') # 验证时区缩写 puts datetime.zone # 对于11月的日期,会输出"PST";如果是夏季日期则输出"PDT"
方法二:临时切换时区上下文
通过Time.use_zone块临时将当前时区设置为太平洋时区,块内创建的时间会自动适配夏令时:
Time.use_zone('Pacific Time (US & Canada)') do datetime = DateTime.new(2012, 11, 17, 3, 2, 0) puts datetime.zone # 同样自动输出对应时区缩写 end
(可选)手动判断时区缩写的方式
如果一定要手动判断,可以借助ActiveSupport::TimeZone的dst?方法检查目标时间是否处于夏令时:
# 获取太平洋时区对象 pacific_tz = ActiveSupport::TimeZone['Pacific Time (US & Canada)'] # 目标时间 target_time = DateTime.new(2012, 11, 17, 3, 2, 0) # 判断是否为夏令时 is_daylight_saving = pacific_tz.dst?(target_time) # 选择对应的时区缩写 zone_abbr = is_daylight_saving ? 'PDT' : 'PST' # 创建带有时区的DateTime datetime = DateTime.new(2012, 11, 17, 3, 2, 0, zone_abbr)
注意:优先推荐前两种方法,因为夏令时的切换规则可能会有调整,Rails会自动维护这些规则,手动判断容易出现遗漏或错误。
内容的提问来源于stack exchange,提问作者duhaime
相关产品推荐
相关产品推荐

