如何将 Ruby 中的 UTC 转换为 EST/EDT?

How to convert UTC to EST/EDT in Ruby?

如何将 '2009-02-02 00:00:00' 格式的 UTC 时间戳转换为 Ruby 中的 EST/EDT?请注意,我没有使用 Rails,而是一个简单的 Ruby 脚本。

1如果日期范围介于 EST(通常是 1 月至 3 月中旬)之间,则需要到 UTC-5 小时。对于美国东部时间,它是 UTC-4 小时。

到目前为止,我有以下函数可以将 UTC 转换为 EST/EDT。

def utc_to_eastern(utc)
    eastern = Time.parse(utc) # 2009-02-02 00:00:00 -0500
    offset_num = eastern.to_s.split(" -")[1][1].to_i # 5
    eastern_without_offset = (eastern-offset_num*60*60).strftime("%F %T") # 2009-02-01 19:00:00
    return eastern_without_offset
end

puts utc_to_eastern("2009-02-02 00:00:00") # 2009-02-01 19:00:00
puts utc_to_eastern("2009-04-02 00:00:00") # 2009-04-01 20:00:00

上面的代码可以满足我的要求,但是我的解决方案有两个问题:

  1. 我不想重新发明轮子,意思是我不想编写时间转换功能,而是使用 Ruby 提供的现有方法。有没有更直观的方法来做到这一点?
  2. 解析使用我的本地时区将 UTC 转换为 EST/EDT,但我想明确定义时区转换 ("America/New_York")。因为这意味着某人 运行 在中央时间的机器上不会使用 EST/EDT.

最好的方法是使用 TZInfo

require 'tzinfo'
require 'time'

def utc_to_eastern utc
  tz = TZInfo::Timezone.get("America/New_York")
  tz.to_local(Time.parse(utc)).strftime('%Y-%m-%d %H:%M:%S')
end

utc_to_eastern "2020-02-02 00:00:00 UTC" => "2020-02-01 19:00:00"
utc_to_eastern "2020-04-02 00:00:00 UTC" => "2020-04-01 20:00:00"