如何在正在运行的ruby进程中更改Date.today的值

时间:2010-10-26 17:44:01

标签: ruby-on-rails ruby date

我知道这是一个坏主意,但我有很多遗留代码,我想要运行一些历史批处理作业。我不想更改系统日期,因为其他东西在同一系统上运行。有没有什么办法可以改变Date.today仅在给定进程的生命周期内返回的值。这里的想法是回放并运行一些旧的批处理脚本,这些脚本用于处理Date.today。

感谢 乔尔

3 个答案:

答案 0 :(得分:6)

你可以像Nikolaus给你看的那样修补Ruby,或者可以使用TimeCop gem。它旨在使编写测试更容易,但您也可以在普通代码中使用它。

# Set the time where you want to go.
t = Time.local(2008, 9, 1, 10, 5, 0)

Timecop.freeze(t) do
   # Back to the future!
end
# And you're back!

# You can also travel (e.g. time continues to go by)
Timecop.travel(t)

这是一段很棒但很简单的代码。尝试一下,当你自己编写日期和时间时,它会让你感到头疼。

链接:https://rubygems.org/gems/timecop

答案 1 :(得分:0)

您可以重新定义Date类的'today'类方法

class Date
  def Date.today
    return Date.new(2000,1,1)
  end
end

这会将Date.today修复为2000-01-01。

答案 2 :(得分:0)

如果重新定义Date.today似乎过于苛刻,可以尝试delorean

从github页面:

require 'delorean'

# Date.today => Wed Feb 24
Delorean.time_travel_to "1 month ago" # Date.today => Sun Jan 24
Delorean.back_to_the_present          # Date.today => Wed Feb 24