Rails时区和cron调度

时间:2013-07-23 18:56:27

标签: ruby ruby-on-rails-3 timezone

我有一台AWS服务器,可以在我们的用户群上运行每日cron作业报告。我想确保我的报告在前一天在MST中运行一整天。目前我使用它作为数据查询的代码

Time.new(Time.now.year, Time.now.month, Time.now.day).yesterday.beginning_of_day.in_time_zone('MST)..Time.new(Time.now.year, Time.now.month, Time.now.day).yesterday.end_of_day.in_time_zone('MST)

我认为使用Time.now是不好的做法,因为这是系统(UTC)时间?我想知道我在做什么是一个很大的不,或者是否有更有效的方式?

谢谢你!

2 个答案:

答案 0 :(得分:2)

山地标准时间比UTC晚7个小时,所以当你从MST的7月22日那天捕获所有数据点时,你希望UTC时间从7/22到7:00 AM到7/23 at UTC时间上午7:00。

我认为您的代码不正确,因为您在in_time_zone("MST")之后致电beginning_of_day

在UTC上的服务器上运行此代码时,评估的时间不同:

>> Time.new.yesterday.beginning_of_day.in_time_zone('MST').utc
=> 2013-07-22 00:00:00 UTC
>> Time.new.in_time_zone("MST").yesterday.beginning_of_day.utc
=> 2013-07-22 07:00:00 UTC

以下是正确确定开始和结束时间的方法:

>> t = Time.new
=> 2013-07-23 19:45:10 +0000
>> start_time = t.in_time_zone("MST").yesterday.beginning_of_day
=> Mon, 22 Jul 2013 00:00:00 MST -07:00
>> end_time = t.in_time_zone("MST").yesterday.end_of_day
=> Mon, 22 Jul 2013 23:59:59 MST -07:00

当我们将开始和结束时间转换为UTC时,我们会得到所需的结果。

>> start_time = t.in_time_zone("MST").yesterday.beginning_of_day.utc
=> 2013-07-22 07:00:00 UTC
>> end_time = t.in_time_zone("MST").yesterday.end_of_day.utc
=> 2013-07-23 06:59:59 UTC

答案 1 :(得分:0)

我不知道你想做什么,但是

Time.new(Time.now.year, Time.now.month, Time.now.day)

绝对是一个可怕的代码片段。例如,如果Time.now.year的执行时间与Time.now.month的执行时间之间的时间滞后与年份更改的时刻重叠,则使用主Time.new创建的时间对象将是这两个时刻都没有。如果您想获得当前时间,请执行

Time.new

Time.now

如果您尝试创建一次计算的时间范围,那么无论您的代码是什么,只创建一次时间:

t = Time.now

并在其余代码中使用它:

t.some_method..t.some_other_method