两个日期之间的精确天数和小时数差异

3
我希望获得两个日期之间的确切天数和小时数,类似于 Thu Jul 18 11:30:00 +0000 2013Sat Jul 20 10:30:00 +0000 2013 之间的差异为 1天23小时。Rails 的 ActionView 模块包括两种方法。
(1) distance_of_time_in_words
(2) distance_of_time_in_words_to_now

但他们返回的结果是1天或2天,我需要小时。

4个回答

7

如果您不想使用任何宝石(gem),那么您可以简单地进行以下计算,以获取精确的分钟和秒钟之间的差异 -

t1 = Time.now #date1
t2 = (Time.now - 10.hours) #date2

seconds = (t1.to_i - t2.to_i)
days = seconds / 86400;
hours = seconds / 3600;
minutes = (seconds - (hours * 3600)) / 60;
seconds = (seconds - (hours * 3600) - (minutes * 60));

6
该问题可以使用插件dotiw来解决。
dotiw是Rails的一个插件,它覆盖了默认的distance_of_time_in_words方法,并提供了更精确的输出。

1
是的,我已经使用了 Dotiw,但似乎这影响了我的项目的其他部分,所以我需要一个替代方案。不过,感谢你提供的解决方案。 - sumit
如果冲突在于dotiw更改了distance_of_time_in_words的输出,那么可以添加:vague选项以使用原始格式,但distance_of_time_in_words_hash仍然可用。 - mindriot

4
有个宝石可以解决这个问题:time_diff!它会展示时间差,你甚至可以格式化输出,例如:'%y, %M, %w, %d and %h:%m:%s' 将返回:'1 year, 2 months, 3 weeks, 4 days and 12:05:52'。它的语法也很简单明了。请点击此处获取更多信息。
> Time.diff(Time.parse('2010-03-06 12:30:00'), Time.parse('2011-03-07 12:30:30'), '%y, %d and %h:%m:%s')
=> {:year => 1, :month => 0, :week => 0, :day => 0, :hour => 18, :minute => 0, :second => 30, :diff => '1 year and 18:00:30'}

你应该能够从这里获得所需的内容。

愉快地编码吧!


1
我在 gem "time_diff" 中遇到了兼容性问题。尽管它已经成功安装,但我仍然在使用 Rails 2.3.2 和 Ruby 1.8.7 时遇到了兼容性问题。你能帮忙解决吗?谢谢。 - sumit
1
看起来time_diff使用的是ActiveSupport v3.0.1,该版本于2010年10月14日发布(请参见Gemfile.lock),而您正在使用的Rails版本早于此:2009年3月15日发布的2.3.2版本。可能存在一些不兼容性。因此有两个解决方案:更新Rails或更新gem本身。Ruby版本没有问题(它由gem本身使用)。另外,只是提供信息,知道1.8.7已不再受支持:http://www.ruby-lang.org/en/news/2011/10/06/plans-for-1-8-7/。希望这可以帮助! - achedeuzot
实际上,我的项目正在使用Rails 2.3.2。我无法升级它。所以我想知道是否可以在Rails 2.3.2中使用time_diff gem。 - sumit
1
如我之前的评论所述,似乎需要 ActiveSupport v3.0.1。您需要检查您的 Rails 2.3.2 版本缺少什么并进行更新。我认为您无法在不对代码进行任何修改的情况下使其正常工作。如果您发布尝试让 gem 正常工作时返回的错误信息,可能会有所帮助。 - achedeuzot
我已经查看了time_diff gem源代码,并直接在我的项目中使用它,它对我很有帮助。谢谢你的支持...实际上,我直接使用了time_diff gem中的代码,而没有安装它,它可以正常工作... - sumit
1
time_diff存在问题。它似乎假定一个月有30天,但实际上并非如此。根据您的用例,这可能是一个问题或不是问题。如果您还需要计算日期之间的月份和年份,则绝对是一个问题。 - pmontrasio

1
date_1 = DateTime.parse("Thu Jul 18 11:30:00 +0000 2013")
date_2 = DateTime.parse("Sat Jul 20 10:30:00 +0000 2013")

difference_in_hours =  (date_2.to_time - date_1.to_time) / 60 / 60

1
这个解决方案对我有用,但它给出了错误的时间差,比如在“Thu, 18 Jul 2013 11:30:00 +0000”和“Wed Jul 17 06:31:44 +0000 2013”之间,它返回了“-72.42713155”。你能解释一下为什么两个连续日期之间可能会有72小时的差异吗?或者请给出提示,如何使它正确工作。 - sumit
1
按照上面的代码应该返回47。你到底运行了什么才得到-72.42713155?另外,我已经更新了我的答案。 - Trip
1
以上示例显示了 47,你是正确的。但如果你计算两个日期之间的差距很大,那么它会给出错误的小时数......感谢您的支持... - sumit
给我你使用的任何两个日期示例,如果它们无法正常工作,我会为你解决问题。 - Trip

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接