0

我有两个ActiveSupport::TimeWithZone对象,比如说t1t2。更改小时和分钟t2以匹配的最佳方法是什么t1?例如,假设t1是 2012 年 4 月 2 日下午 3:45 和 2012 年t24 月 15 日下午 6:00。我想t2在下午 3:45 更改为 2012 年 4 月 15 日。

我对也适用于Time对象的解决方案感到满意。

到目前为止我有这个:

Time.zone.parse "#{t1.strftime "%Y-%m-%d"} #{t2.strftime "%H:%M:%S"}"

4

3 回答 3

1

这应该这样做:

t2.change(hour: t1.hour, min: t1.min)

文档。

于 2012-08-03T11:37:28.127 回答
1

通常你只需要使用 Time.mktime。不过,整个 ActiveSupport::TimeWithZone 有点乏味。对于 ActiveSupport::TimeWithZone,我建议:

t1 = Time.mktime(2012,4,15,18)
t2 = Time.mktime(2012,4,15,15,45)
t3 = Time.mktime(t1.year, t1.month, t1.day, t2.hour, t2.min, 0, 0, Time.zone.utc_offset).in_time_zone(Time.zone)

在纯红宝石中,您只需执行第一部分:

t1 = Time.mktime(2012,4,15,18)
t2 = Time.mktime(2012,4,15,15,45)
t3 = Time.mktime(t1.year, t1.month, t1.day, t2.hour, t2.min)

至于性能差异,mktime(包括 .in_time_zone 的东西)在这里大约快 15 倍(Time.zone.parse 需要 0.49 毫秒,Time.mktime 需要 0.03 毫秒)。

希望有帮助

于 2012-04-13T23:41:03.900 回答
0

不确定您到底要做什么,但是可以直接添加或减去 Time 对象(秒是默认的时间单位,但在这种情况下并不重要)。假设 t2 是一个 Time 对象,这个简单的代码将为您提供与 t1 匹配的时间的更新 t2:

t2 = 2012-04-15 18:00:00 -0400 # This is how a Time object is displayed in irb
t2 = t2 - (t2 - t1) # I did this in irb with require 'active_support', but it should work in Rails 3.x.

我对 Rails 比较陌生,所以如果我过于简单,请原谅我,但我希望这能解决你的问题。

于 2012-04-13T21:56:05.147 回答