2010-06-16 62 views
34

我有一种感觉有人会指出我回答这个问题的另一个问题,但我一直在寻找这个简单问题没有运气。计算天差异ActiveSupport:TimeWithZone以最“红宝石”的风格?

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

我想知道的是风格是否有一个“干净”的方式来做到这一点,而不是减去和除以86400的结果?

这是我做的:

((Time.zone.now - myActiveRecord.visit_date)/86400).to_i 

作品,但似乎未rubyish,我觉得我失去了一些东西。我应该投射,比较还是转换其他路线,或者这是否是在轨道中执行此操作的典型方法?欣赏任何提示或指向已经涵盖此问题的链接。

谢谢

+0

你当一切都说过和做过要输出的话吗? – theIV 2010-06-16 00:17:01

+0

我仅限于在momemnt的模型中进行此操作,所以我无法利用time_ago_in_words助手。我只是把int值带回客户端应用程序。感谢大家的反馈。 – Nick 2010-06-16 17:29:17

回答

73

有一两件事可以做,以使其更具可读性是:

((Time.zone.now - myActiveRecord.visit_date)/1.day).to_i 

编辑:

其实你可以摆脱一组用括号中:

(Time.zone.now - myActiveRecord.visit_date).to_i/1.day 
+0

实际上有一种方法可以在下面提到。 – jamesconant 2015-01-12 16:30:00

+0

''(Time.zone.now - 3.days.ago).to_i/1.day''会输出''2'' – dgilperez 2015-02-19 03:24:34

+1

这并不总是奏效。我不得不这样做:'(myActiveRecord.end_date.to_datetime.to_i - Time.now.to_i)/ 1.day' – 2015-03-23 19:15:27

14

我知道这个问题有点过时,但我碰到它,而谷歌搜索类似问题。就我而言,我需要从宏观和微观的角度来了解整天的差异。

例如,我需要我的代码才能告诉我,2010年12月31日是2012年1月1日前的366天,而2010年12月31日23:59是1天后从2011年1月1日00: 00。上面的方法适用于前者,但在后者的情况下,它表示它们相隔0天。

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

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

这将在TimeDateTime与投入工作,由于转换。另一个可能的解决方案是首先拨beginning_of_dayTimesDateTimes的每一个,但在我的情况下,分钟是重要的。

-1

Rails实际上有一种内置于此类事物的方法。

结账#time_ago_in_words

所以,原来如此......

((Time.zone.now - myActiveRecord.visit_date)/86400).to_i

VS

time_ago_in_words(myActiveRecord.visit_date)

+0

实际上,该方法返回一个人类可读的字符串描述,而不是实际的数字差异。 – 2015-01-13 14:45:53

+0

哎呀,很好。 – jamesconant 2015-01-14 14:53:09