调整日期时间

时间:2012-04-13 21:08:29

标签: ruby-on-rails ruby time

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

我对使用Time个对象的解决方案感到满意。

到目前为止,我有这个:

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

3 个答案:

答案 0 :(得分: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.49ms,Time.mktime需要0.03ms)。

希望有所帮助

答案 1 :(得分:1)

这应该这样做:

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

Documentation.

答案 2 :(得分:0)

不确定您要做什么,但可以直接添加或减去Time对象(秒是默认的时间单位,但在这种情况下无关紧要)。假设t2是一个Time对象,这个简单的代码会给你一个更新的t2,其时间与t1匹配:

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比较新,所以请原谅我,如果我过于简单化,但我希望这能解决你的问题。