how to get time difference in minutes in rails for two date time fields?
我想计算两个日期时间字段之间的时间差(以分钟为单位),如创建时间字段和更新时间字段。我想要这样的结果
这些时间都出现在印度的时区。我怎样才能在铁路上做到这一点?
1 2 3 4
| created = article.created_at
updated = article.updated_at
minutes = updated - created |
- 你能清理一下这里的东西吗?你所说的date_time字段是什么意思?DateTime数据类型的字段?
此解决方案适用于使用created_at和updated_at的TimeWithZone类的ActiveRecord模型。
1 2 3 4
| created = article.created_at
updated = article.updated_at
minutes = (updated - created) / 1.minutes |
- 如果你的工作是Timecreated_at/ updated_at的实例。这是不是说,他在他的回答。我想知道,它取决于在应用程序设置CAN或Rails版本或东西吗?
由于created_at和updated_at是DateTime型的,这应该是有效的。
1 2 3
| created = article.created_at
updated = article.updated_at
minutes = ((updated - created) * 24 * 60).to_i |
说明:
减去两个日期时间返回以天为单位的已用时间。在下面的示例中,e-d将返回(28807336643183/28800000000000)。所以要把它转换成分钟,我们需要用24*60乘以它(因为一天有24小时,每小时有60分钟)。
示例(已测试):
1 2 3 4 5 6
| d = DateTime.now
=> Tue, 13 Jun 2017 10:21:59 +0530
2.3.3 :003 > e = DateTime.now + 1.day
=> Wed, 14 Jun 2017 10:22:21 +0530
g = ((e-d) * 24 * 60).to_i
=> 1440 |
号
- 对不起,这怎么办?updated - created会给你以秒为单位的时间差,它应该除以60来给你几分钟。我不知道你为什么用这些秒乘以一天中的分钟数…
- 这个答案不正确。我把正确的答案写在下面
- 小心@doug我因为质疑这个答案并提供正确的解决方案而被否决。好像在玩游戏…5票赞成一个完全错误的答案?无法逻辑解释…
- @你读过这个问题吗?created_at和updated_at属于日期时间类型,而不是时间类型。所以这是正确的答案,你的答案是错误的!
- @道格你读过这个问题吗?created_at和updated_at属于日期时间类型,而不是时间类型。所以这是正确的答案,你的答案是错误的!
- @Toxaq这里什么都没有!我得到了赞成票,因为这是一个正确的答案。就这么简单!
- @帕万我先问了一下,没有回答。你发现创建和更新的时间戳违背了Rails的惯例,使用了日期时间字段而不是标准的时间戳,这真是不可思议的精明。向你致敬!我认为,考虑到许多人已经做出了准确的查询,并按照惯例提供了解决方案,这应该得到一些额外的解释。同样,你在细节上发现了魔鬼,做得很好。
- @托克斯,我们好吗?我们能成为朋友吗:)
- @哈哈,从来没有朋友!我最初的查询是一个黑暗中的回音:p您能为其他人(比如道格和我自己)添加一些关于时间戳和日期时间的澄清吗?我已经删除了我的答案。
- @托克斯当然!我再加一句!
- @你的意思是时间和日期时间?
- @帕万井这真的增加了更多的困惑。在Rails迁移中,使用t.timestamps添加创建的和更新的。至少在Postgres中,这会创建一个timestamp without time zone字段,如果您检查模型的类,那么它将是一个ActiveSupport::TimeWithZone,就像时间一样。因此,任何澄清都可以围绕类与列以及约定进行。
- @托克斯,我会把它清理干净的。给我点时间:)
- @toxaq :datetime和:timestamp将默认为datetime,而:time默认为time check this stackoverflow.com/questions/3928275/…。我想问一下你是怎么得到ActiveSupport::TimeWithZone的?
- @帕万这个问题并没有说江户十一〔12〕,而是说江户十一〔13〕不是真的。它还说,date time也不是一回事。大多数从Google提出这个问题的人都会提到带有TimeWithZone的ActiveRecord模型(这是我发现的方法),在这种情况下,您的回答是错误的。我假设op意味着文章是一个activerecord模型,并且created_at和updated_at是默认的TimeWithZone,而不是DateTimeop也表示时间在印度时区。DateTime不包含该信息。
- @道格让我们不要在这里重提这个论点。我同意这个问题有点不清楚,也有点误导性。但我不同意DateTime没有TimeZone。它确实有时区。在我的例子中,+530是TimeZone。您可以查看文档。我希望OP能消除一些混乱,这样我们两个都能做得一样好!
- 很公平。我已经更新了我的答案,指定它与TimeWithZone一起工作。不幸的是,我无法编辑我的评论。
- @道格我恢复了投反对票,并投了反对票:)
- 错了!不要使用这种方法。使用@doug方法。
看着助手time_ago_in_words我们可以说:
1 2 3 4 5
| from_time = from_time.to_time if from_time.respond_to?(:to_time)
to_time = to_time.to_time if to_time.respond_to?(:to_time)
#absolute distance:
from_time, to_time = to_time, from_time if from_time > to_time
distance_in_minutes = ((to_time - from_time)/60.0).round |
。
这就是我使用的方法,它只需要为您处理几天或几分钟的时间,并为您提供差异time_ago_in_words只需传递一个日期时间、日期或时间对象,它将返回人类可读的差异。埃多克斯1〔10〕
- dwonvoted。这个问题问的结果分钟真的需要作为一个字符串。