rails - 将DateTime与DateTime.now进行比较

时间:2013-12-04 17:40:12

标签: ruby-on-rails ruby datetime time datetime-format

我有一个rake任务应该通过我的Task模型,如果time_frame属性在过去(DateTime.now> task.time_frame),应该放一些信息。这是代码:

task :change_it => :environment do
  @tasks = Task.already_expired
  @tasks.each do |task|
      puts "Kalabar" + task.inspect + "now time is:" + DateTime.now.to_s
  end
end

Task.already_expired在Task模型中定义如下:

def self.already_expired
    where("time_frame < ?", DateTime.now)
end

问题是,它正在打印所有任务,而不仅仅是过去的任务。以下是运行&#39; rake change_it&#39;:

的输出
Task Load (1.2ms)  SELECT "tasks".* FROM "tasks" WHERE (time_frame < '2013-12-04 17:25:37')
    Kalabar#<Task id: 3, title: "task 1 - past", content: "Should show this one", 
        created_at: "2013-12-04 17:05:53", updated_at: "2013-12-04 17:05:53", 
        schedule_id: 2, amount: nil, time_frame: "2013-12-02 08:15:00">
        now time is:2013-12-04T12:25:37-05:00
    Kalabar#<Task id: 5, title: "another task - past", 
        content: "should show this one", created_at: "2013-12-04 17:11:23", 
        updated_at: "2013-12-04 17:11:23", schedule_id: 3, amount: nil, 
        time_frame: "2013-12-03 02:07:00">now time is:2013-12-04T12:25:37-05:00
    Kalabar#<Task id: 6, title: "another task - future", 
        content: "should not show at first", created_at: "2013-12-04 17:11:23",
        updated_at: "2013-12-04 17:25:09", schedule_id: 3, amount: nil, 
        time_frame: "2013-12-04 12:27:00">now time is:2013-12-04T12:25:37-05:00

正如您在上面代码段的第一行所看到的那样,它正在寻找

time_frame < '2013-12-04 17:25:37'.  

我不知道从哪里来17:25:37。我该如何解决?感谢。

更新:

我没有意识到17:25:37是UTC的当前时间。问题是我需要将用户输入的日期时间转换为UTC,然后再将其放入数据库。有谁知道怎么做?

更新:

自从发布此问题以来,我的问题已经改变了。以下是新问题:rails - convert DateTime to UTC before saving to server

1 个答案:

答案 0 :(得分:2)

您将获得17:25:37因为DateTime.now返回表示当前时间的日期时间对象。

如果您希望DateTime.now.to_date小于或等于“昨天”的任务,则可以使用DateTime.now.midnighttime_frame

<强>更新 要将time_frame设置为UTC,请将以下模型添加到Task类。请根据您的需要适当更新strptime中的格式:

# app/models/task.rb

def time_frame=(value)
  write_attribute :time_frame, Date.strptime(value, "%m/%d/%Y").to_datetime.utc if value.present?
end