获取特定时区当天开始时间的时间对象

19

如何获取在给定时区中特定日期开始一天的 Ruby Time 对象。


只是一条评论,因为我不知道 Ruby 如何处理时区:午夜并不总是存在,而且可能会发生两次。例如,巴西在午夜更改时钟。你应该找到一天的开始,而不是午夜。 - Jon Skeet
有趣的观点。对于我的目的,我感兴趣的是一天的开始。谢谢Jon。我会更新问题。 - Blake Taylor
你的实际使用情况是什么?(我发现这个问题是因为我想要获取加利福尼亚州最近的午夜时间,作为UTC,用于API配额跟踪。) - David J.
4个回答

31
date = Date.today

date.to_time.in_time_zone('America/New_York').beginning_of_day

当前输出 => 2011年11月2日00:00:00 -0400

Time.now.in_time_zone('Asia/Shanghai').beginning_of_day

当前输出为 => 2011年11月3日 00:00:00 +0800

date = Date.today

date.to_time.in_time_zone('Asia/Shanghai').beginning_of_day

目前的输出为 => 2011-11-02 00:00:00 +0800


1
我希望那会儿很简单,但不幸的是,在时区转换后到达的时间是否在同一天并没有保障。这取决于起始和终止时区,有时候会在同一天,有时候则不行。我想我可以在转换后比较日期组件和原始值,并根据需要进行调整,但那样太笨重了。我希望有一种优雅的方式,总是能起作用。希望 api 中有相关方法,我认为这不是一个疯狂的想法。 - Blake Taylor
我可能完全不理解您想做什么,但是 date.to_time.in_time_zone('时区').beginning_of_day 会为原始指定日期提供00:00:00 UTC。 - Timothy Hunkele
1
它不会给你0 UTC,而是给你时区中的0,这更可取。但是,在使用in_time_zone转换时区之前,它并不会这样做,因此日期不一定再有效。以下是我所说的示例。date.to_time.in_time_zone('Asia/Shanghai').midnight.in_time_zone(Time.zone).midnight #=> 过去一天。理想情况下,Ruby应该允许我像这样做。date.to_time(zone) - Blake Taylor

6

我最终使用了ActiveSupport::TimeZone对象上的#local方法,传递了Date对象的组件。

# Get example date and time zone...
date = Date.today
timezone = ActiveSupport::TimeZone['America/New_York']

# Get beginning of day for date in timezone
timezone.local(date.year, date.month, date.day)

5

不确定这是否有帮助,但这让我知道我的Google API配额何时重置:

# The most recent midnight in California in UTC time
def last_california_midnight
  (Time.now.utc - 7.hours).midnight + 7.hours
end

我用Mongoid这样使用它,例如:
def api_calls_today
  Call.where(updated_at: { '$gte' => last_california_midnight }).count
end

无论代码部署在哪个时区,只要Mongo设置为UTC,就可以正常运行。

1
要获取特定的日期,例如 1/2/2021(天:1,月份:2,年份:2021)。
("1/2/2021").to_time.in_time_zone('Asia/Shanghai').beginning_of_day
#=> Mon, 01 Feb 2021 00:00:00.000000000 CST +08:00

获取当前日期。
Time.zone = 'Asia/Shanghai'
Time.current.beginning_of_day
#=> Mon, 12 Jul 2021 00:00:00.000000000 CST +08:00

我总是参考时间而不是日期,因为从一开始就可以确保我得到了所需时区的正确输出。

请注意,这两种方式都提供相同格式的结果。因此,您可以在进一步的时间差计算中使用它。

当定义时区时,我更喜欢使用Time.current而不是Time.now,这可以确保时间处于您想要的时区。无论如何,在使用之前,请始终在Rails Console中检查结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接