在不改变时间的情况下在时区之间转换时间?

时间:2015-09-07 04:46:19

标签: ruby-on-rails ruby

我们的系统目前默认为悉尼时间。我试图将一些报告本地化到另一个时区而不改变报告的每日间隔(即00:00:00到23:59:59)。

每当我尝试将时间对象转换为另一个时区时,它会将小时/分钟/秒与区域一起转换。

[16] pry(main)> t = Time.now
=> 2015-09-07 14:41:33 +1000

[17] pry(main)> t.in_time_zone("Darwin")
=> Mon, 07 Sep 2015 14:11:33 ACST +09:30

有人可以指出我正确的方向吗?

谢谢!

3 个答案:

答案 0 :(得分:3)

您可以使用Time::use_zone覆盖给定块内的时区:

t = Time.parse('2015-09-07 14:41:33 +1000')
#=> 2015-09-07 14:41:33 +1000

Time.use_zone('Darwin') { Time.zone.local(t.year, t.month, t.day, t.hour, t.min, t.sec) }
#=> Mon, 07 Sep 2015 14:41:33 ACST +09:30

或快捷方式:

Time.use_zone('Darwin') { Time.zone.local(*t) }
#=> Mon, 07 Sep 2015 14:41:33 ACST +09:30

*tt转换为数组(使用Time#to_a)并将其元素作为参数传递:

  

可以将十个元素直接传递给::utc::local以创建新的Time对象。

答案 1 :(得分:1)

使用正则表达式可能是最简单的方法:

t = Time.now
#=> 2015-09-07 05:53:23 +0000
Time.parse t.to_s.sub(/[+-]\d+$/, '+0930')
#=> 2015-09-07 05:53:23 +0930

答案 2 :(得分:0)

我找到了一个解决方案..请随意留下任何更好的答案,因为我还是一个低年级的人。

我创建了以下方法:

def export_in_timezone(time, zone)
  Time.use_zone(zone) { time.to_datetime.change(offset: Time.zone.now.strftime("%z")) }
end

并传入每个正在创建的报告的时间和时区。

谢谢!

相关问题