我有一个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)
我读到使用时间是不好的做法。这是系统(UTC)时间吗?我想知道我所做的是不是一个很大的拒绝,或者是否有更有效的方法?
谢谢!
山地标准时间比UTC晚7小时,因此当您在MST中捕获7月22日当天的所有数据点时,您希望UTC时间是从UTC上午7:00的7/22到UTC上午7:0023的7/23。
我认为您的代码不正确,因为您在beginning_of_day
之后调用in_time_zone("MST")
。
当您在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
我不知道你想做什么,但
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