如何修改Time对象的日期?是否存在指定方法实现日期替换?
修改Time对象日期的方法及自定义实现
嘿,刚好对这个场景很熟悉,来给你详细说说:
1. 如何修改Time对象的日期?
这得分两种情况看——如果你用的是Rails中的ActiveSupport::TimeWithZone对象(比如你例子里的Time.zone.now),Rails已经提供了非常便捷的方法;如果是原生Ruby的Time对象,就得用另一种方式组合。
Rails环境下(推荐,因为你用了Time.zone)
Rails的ActiveSupport给时间对象扩展了change方法,可以单独修改年、月、日、时、分等任意时间组件,完全满足修改日期的需求。用法很简单:
# 假设你已有Time实例 time = Time.zone.now # => Tue, 03 Apr 2018 09:44:14 EDT -04:00 # 要改成的目标日期 target_date = Date.parse("2018-04-13") # 修改日期,保留原时间和时区 modified_time = time.change(year: target_date.year, month: target_date.month, day: target_date.day) # => Tue, 13 Apr 2018 09:44:14 EDT -04:00
原生Ruby环境下
如果是原生Time对象,没有内置的change方法,需要手动构造新的Time实例:
time = Time.now target_date = Date.parse("2018-04-13") modified_time = Time.new( target_date.year, target_date.month, target_date.day, time.hour, time.min, time.sec, time.utc_offset # 保留时区偏移 )
2. 有没有类似set_date_to的现成方法?
Rails默认没有叫set_date_to的方法,但我们可以自己封装一个,用起来更符合你的预期。只需要给ActiveSupport::TimeWithZone添加一个实例方法就行:
# 可以放在Rails项目的config/initializers/time_extensions.rb里 class ActiveSupport::TimeWithZone def set_date_to(date) change(year: date.year, month: date.month, day: date.day) end end
这样之后,你就可以完全按照自己想要的方式调用了:
time = Time.zone.now # => Tue, 03 Apr 2018 09:44:14 EDT -04:00 time.set_date_to(Date.parse("2018-04-13")) # => Tue, 13 Apr 2018 09:44:14 EDT -04:00
这个自定义方法本质上就是封装了change的逻辑,用起来更直观~
内容的提问来源于stack exchange,提问作者Tom Lehman
相关产品推荐
相关产品推荐

