【问题标题】:Convert ActiveSupport::TimeWithZone to DateTime将 ActiveSupport::TimeWithZone 转换为 DateTime
【发布时间】:2011-05-28 13:17:53
【问题描述】:

我尝试在两个日期之间每 N 天进行一次。我尝试了以下代码,但没有工作,因为 startDate 和 endDate 是 ActiveSupport::TimeWithZone 对象,而不是我想的 DateTime 对象。

startDate.step(endDate, step=7) { |d| puts d.to_s}
  min.step(max, step=stepInt){ |d|
  puts d.to_s  
}

如何将 TimeWithZone 对象转换为 DateTime?

【问题讨论】:

    标签: ruby-on-rails ruby datetime


    【解决方案1】:

    我认为更新这个答案可能很有用,因为我最近正在搜索这个。实现这种转换的最简单方法是使用 .to_datetime() 函数。

    例如

    5.hours.from_now.class              # => ActiveSupport::TimeWithZone
    5.hours.from_now.to_datetime.class  # => DateTime
    

    参考:http://api.rubyonrails.org/classes/ActiveSupport/TimeWithZone.html#method-i-to_datetime

    【讨论】:

      【解决方案2】:

      DateTime 是您通常希望避免使用的旧类。 TimeDate 是您要使用的两个。 ActiveSupport::TimeWithZone 的行为类似于 Time

      对于跨日期,您可能需要处理 Date 对象。您可以使用Time#to_dateTime(或ActiveSupport::TimeWithZone)转换为Date

      from.to_date.step(to.to_date, 7) { |d| puts d.to_s }
      

      【讨论】:

      • stackoverflow.com/questions/1261329/… 推荐 DateTime 作为处理日期的最佳方式!
      • DateTime 是一个 Ruby 类。 ActiveSupport::TimeWithZones 是 Rails。所以说它是“旧的”并且你应该避免它是不准确的。请参阅 ChrisJ 的答案以获得更好的响应。
      • Postgres 的 'Timestamp' 转换为 Rails 的 TimeWithZone,with 显示起来一点都不友好,所以使用 DateTime 通常会更好,在这里 4 年后它仍然不旧。
      • 为什么要避免使用 DateTime? DateTime 是日期和时间的聚合。所以如果我需要日期加时间,我应该使用 DateTime,不是吗?虽然看起来时间也给了你日期。加上时间,您可以使用区域,例如Time.zone.now => 2015 年 6 月 2 日星期二 14:01:58 EDT -04:00,为您提供日期和时间以及时区。
      • @Donato 您要避免使用 DateTime,因为 Time.zone 可以完成 DateTime 可以做的所有事情,并且比记住在您的日期时间之后添加 .in_time_zone 更容易记住。更多示例和推理在这里:danilenko.org/2012/7/6/rails_timezones
      猜你喜欢
      • 1970-01-01
      • 2011-05-07
      • 1970-01-01
      • 2011-01-31
      • 1970-01-01
      • 2012-10-08
      • 2018-12-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多