如何更改 Ruby 中时间的时区?

问题描述 投票:0回答:1

假设我有一个带有时区的 Time 对象(比如 UTC)。我想将时区重置为任意时区(又名,不是您当地的时区)而不改变时间的任何其他参数,例如“小时”。 从版本 3.3 开始,Ruby 似乎没有提供任何单一方法来执行此操作(参见 Time 的官方文档Stackoverflow 答案)。那我怎样才能实现这个目标呢?

我注意到,对于 DateTime 类,

change
方法(看起来)的工作原理与 这个答案 中一样。然而,

DateTime 类被视为已弃用。使用时间类。

as in Ruby 3 所以我想知道如何使用 Time 类来做到这一点。

我还注意到 Rails 实现了一些方便的方法,如这些答案中提到的;但它们在纯 Ruby 中不可用(事实上,Rails 的

in_time_zone
更改了另一个时间参数,
hour
)。

我怎样才能用纯 Ruby 做到这一点?

ruby time timezone
1个回答
0
投票

似乎没有简单的方法可以在纯 Ruby 中实现这一目标,“将时区重置为任意时区而不改变时间的任何其他参数”(参见官方文档)。

我在这里列出了一些解决方法:

require "time"
t = Time.now(in: "+00:00")
  # => <2024-02-24 01:23:45 +0000>

t1= Time.new(*(t.to_a.reverse[4..-1]), in: "+09:00")
  # => <2024-02-24 01:23:45 +0900>

t2= Time.new(t.year, t.month, t.day, t.hour, t.min, t.sec+t.tv_nsec.to_f/1e9, in: "+09:00")
  # => <2024-02-24 01:23:45 ... +0900>

ar = t.strftime("%Y %m %d %H %M %S %N").split.map(&:to_i)
t3= Time.new(*(ar[0..4]+[ar[5]+ar[6].to_f/1e9, "+09:00"]))
  # => <2024-02-24 01:23:45 ... +0900>

t4= Time.at(t, in: "+09:00") - 9*3600
  # => <2024-02-24 01:23:45.... +0900>

这里,

t1
只考虑到一秒,而其他的则考虑到纳秒。

t2
是最直观的,但是也是最麻烦的。 虽然
t4
不太长,但它违反了 DRY 原则并且您必须准确指定奇偶校验(正或负?),这是显着的缺点。

© www.soinside.com 2019 - 2024. All rights reserved.