【问题标题】:Get Time Object at Start of Day in a Particular Time Zone在特定时区的一天开始时获取时间对象
【发布时间】:2011-12-20 18:47:45
【问题描述】:

如何获得一个 ruby​​ Time 对象,它表示给定时区中特定日期的一天的开始。

【问题讨论】:

  • 只是一个评论,因为我对 Ruby 的时区处理一无所知:午夜并不总是存在,它可能会出现两次。例如,巴西在午夜改变时钟。相反,您可能应该找到一天的开始。
  • 有趣的地方。就我而言,一天的开始是我感兴趣的。谢谢乔恩。我会更新问题。
  • 您的实际用例是什么? (我发现这个问题是因为我想获得加利福尼亚州最近的午夜,作为 UTC,用于 API 配额跟踪。)

标签: ruby-on-rails ruby time date activesupport


【解决方案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 中查看结果。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-12-03
        • 2016-07-02
        • 2020-09-25
        • 2016-01-19
        • 2011-11-05
        • 2016-03-12
        • 2022-01-18
        • 1970-01-01
        相关资源
        最近更新 更多