在特定时区的一天开始时获取时间对象
Posted
技术标签:
【中文标题】在特定时区的一天开始时获取时间对象【英文标题】:Get Time Object at Start of Day in a Particular Time Zone 【发布时间】:2011-12-20 18:47:45 【问题描述】:如何获得一个 ruby Time 对象,它表示给定时区中特定日期的一天的开始。
【问题讨论】:
只是一个评论,因为我对 Ruby 的时区处理一无所知:午夜并不总是存在,它可能会出现两次。例如,巴西在午夜改变时钟。相反,您可能应该找到一天的开始。 有趣的地方。就我而言,一天的开始是我感兴趣的。谢谢乔恩。我会更新问题。 您的实际用例是什么? (我发现这个问题是因为我想获得加利福尼亚州最近的午夜,作为 UTC,用于 API 配额跟踪。) 【参考方案1】:date = Date.today
date.to_time.in_time_zone('America/New_York').beginning_of_day
当前输出 => 2011-11-02 00:00:00 -0400
Time.now.in_time_zone('Asia/Shanghai').beginning_of_day
当前输出 => 2011-11-03 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
【讨论】:
我希望它是那么简单。不幸的是,不能保证您在时区转换后到达的时间是在同一天。有时它会,有时它不会取决于开始和结束区域。我想我可以将转换后的日期部分与原始值进行比较,并在必要时进行调整,但这真的很笨拙。我希望的是一种优雅的方式,它总是有效的。希望 api 中有一些东西,我不认为这是一件疯狂的事情。 我可能不完全理解您要做什么,但date.to_time.in_time_zone('TIMEZONE').beginning_of_day
为您提供原始指定日期的 00:00:00 UTC。
它不会给你 0 UTC,它会在时区给你 0,这是更可取的。但是,在使用 in_time_zone 转换时区之前它不会这样做,因此日期不一定再有效。这是我的意思的例子。 date.to_time.in_time_zone('Asia/Shanghai').midnight.in_time_zone(Time.zone).midnight #=> One day in the past.
。理想情况下,红宝石应该允许我做这样的事情。 date.to_time(zone)
.【参考方案2】:
我最终在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)
【讨论】:
【参考方案3】:不确定这是否有帮助,但这可以让我知道我的 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,这都将起作用。
【讨论】:
【参考方案4】:获取特定日期,例如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 中查看结果。
【讨论】:
以上是关于在特定时区的一天开始时获取时间对象的主要内容,如果未能解决你的问题,请参考以下文章