我有一个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
答案 0 :(得分:2)
您将获得17:25:37
因为DateTime.now
返回表示当前时间的日期时间对象。
如果您希望DateTime.now.to_date
小于或等于“昨天”的任务,则可以使用DateTime.now.midnight
或time_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