【问题标题】:How to create time property that is always 24 hours behind current time?如何创建始终比当前时间晚 24 小时的时间属性?
【发布时间】:2021-11-29 08:34:56
【问题描述】:

我正在创建一个时间对象,用于收集过去 24 小时的所有信息,创建显示当前时间的对象没有问题。但我不确定如何在没有附加时区的情况下将其精确设置为过去 24 小时。

  def set_time
     @past_time = Time.now.to_s(:db) - 1.days
  end

预期输出格式:

 "2021-11-29 09:15:17"

结果:

 undefined method `-' for "2021-11-29 10:19:46":String

【问题讨论】:

  • 什么时候不应该附加时区信息,那么使用什么时区呢?服务器的时区可能是 UTC 或任何其他时区或您的本地时区?
  • 请注意,默认情况下,Rails 在将时间戳保存到数据库时将其转换为 UTC,并在从数据库中读取它们时将其转换回本地时间。因此,如果您打算将该时间对象仅用于查询,则可能需要重新发明轮子。

标签: ruby-on-rails ruby


【解决方案1】:

当您使用 to_sTime.now 转换为字符串时,您正在从字符串对象中减去时间。

你可以这样做

(Time.new - 1.days).to_s(:db)

注意:您将获得多种方法来完成这些轨道。这样做可以提高代码的可读性和对代码的理解。

例子:

DateTime.now.days_ago(1)

【讨论】:

    【解决方案2】:

    我能想到的最简单的方法是:

    24.hours.ago.to_s(:db)
    

    请注意,在这种情况下,返回的时间将默认为 UTC。

    【讨论】:

      【解决方案3】:

      您可以使用来自 ActiveSupport 的DateTime#advance

      Time.current.advance(hours: -24)
      # or 
      Time.current.advance(days: -1)
      

      请注意,在使用 DST 的时区中,一天并不总是 24 小时,因此两者实际上并不相等。你也可以使用ActiveSupport::Duration monkeypatches 到 Integer 的方法:

      24.hours.ago
      1.day.ago
      

      不过,这始终使用您的默认时区。

      【讨论】:

      • 感谢您的回答,但是,以上所有内容都返回时区附件,即 CET +01:00。而我在不接受时区声明的 API 的特定查询参数中使用它。
      • 如果您不想使用应用程序的时区,请使用 Time.now.utcTime.now.in_time_zone(timezone)。即使 API 没有声明时区,您仍然需要确定您实际将时间视为哪个时区。
      猜你喜欢
      • 2015-11-29
      • 1970-01-01
      • 2014-01-15
      • 2021-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多