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

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 中查看结果。

【讨论】:

以上是关于在特定时区的一天开始时获取时间对象的主要内容,如果未能解决你的问题,请参考以下文章

Rails:在时区获取#beginning_of_day

Microsoft bot 框架获取用户时区

pytz:获取所有时区,现在在特定时间范围之间

给定 UTC 时间,获取特定时区是午夜

如何在 Dynamics CRM 中获取时区的夏令时开始和结束?

获取节点 js 服务器上特定时区的当前时间