0

我有一个 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)时间?我想知道我所做的是否是一个很大的不,或者是否有更有效的方法?

谢谢你!

4

2 回答 2

2

山区标准时间比 UTC 晚 7 小时,因此当您在 MST 中从 7 月 22 日当天捕获所有数据点时,您希望 UTC 时间从 7 月 22 日上午 7 点 UTC 到 7 月 23 日上午 7 点世界标准时间。

我认为您的代码不正确,因为您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
于 2013-07-23T19:15:51.643 回答
0

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

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

绝对是一个可怕的代码片段。例如,如果执行时间Time.now.year和执行时间之间的时间Time.now.month差与年份变化的时刻重叠,则使用 main 创建的时间对象Time.new将不是这两个时刻中的任何一个。如果您想获取当前时间,只需执行

Time.new

或者

Time.now

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

t = Time.now

并在您的其余代码中使用它:

t.some_method..t.some_other_method
于 2013-07-23T19:11:00.057 回答