以最"红宝石"风格计算ActiveSupport:TimeWithZone的天数差异?

Nic*_*ick 40 ruby-on-rails

我有一种感觉,有人会指出另一个问题来解决这个问题,但我一直在寻找这个简单问题的运气.

我有一个带有datetime属性的Activerecord.它作为ActiveSupport返回:TimeWithZone.我知道我无法将它与DateTime.now进行比较,因为它不包含区域所以我需要使用Time.zone.说得通.

我想知道的是stylewise是否有一种"更清洁"的方法来做到这一点,而不是将结果减去86400?

这是我做的:

((Time.zone.now - myActiveRecord.visit_date)/86400).to_i
Run Code Online (Sandbox Code Playgroud)

工作,但似乎没有rubyish,我觉得我错过了一些东西.我应该进行铸造,比较或转换其他路线,还是这是在铁轨中执行此操作的典型方式?感谢任何提示或指向已涵盖此问题的链接.

谢谢

Jak*_*mpl 81

你可以做的一件事是让它更具可读性:

((Time.zone.now - myActiveRecord.visit_date) / 1.day).to_i
Run Code Online (Sandbox Code Playgroud)

编辑:

实际上你可以用以下方法摆脱一组括号:

(Time.zone.now - myActiveRecord.visit_date).to_i / 1.day
Run Code Online (Sandbox Code Playgroud)


Aar*_*ron 20

我知道这个问题有点过时但我在搜索类似问题时遇到了它.就我而言,我需要在宏观和微观尺度上了解整天的差异.

例如,我需要我的代码才能告诉我2010年12月31日是2012年1月1日之前的366天,而2010年12月31日23:59是距离2011年1月1日00:00的1天.上述方法在前者中起作用,但在后者的情况下,它表示它们相隔0天.

我最终做的是使用Ruby的Date类为我做数学.使用上面的代码我的方法如下所示:

(Time.zone.now.to_date - myActiveRecord.visit_date.to_date).to_i

这将适用于转换中TimeDateTime由于转换而产生的输入.另一种可能的解决方案是首先打电话beginning_of_day给每个Times或者DateTimes在我的情况下,会议记录很重要.