【问题标题】:Exact Difference between two dates in days and hours两个日期的天数和小时数之间的精确差异
【发布时间】:2013-07-16 14:22:31
【问题描述】:

我想获得两个日期之间的确切时间(以天和小时为单位),例如在 Thu Jul 18 11:30:00 +0000 2013Sat Jul 20 10:30:00 +0000 2013 之间。 1 day and 23 hours 有区别。 Rails 的 ActionView 模块包含两个方法

(1) distance_of_time_in_words
(2) distance_of_time_in_words_to_now

但他们返回的结果像 1 天或 2 天,我也需要几个小时。

【问题讨论】:

    标签: ruby-on-rails ruby time


    【解决方案1】:

    如果您不想使用任何 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));
    

    【讨论】:

      【解决方案2】:

      插件dotiw 可能有助于解决这个问题。

      dotiw 是 Rails 的一个插件,它覆盖默认的 distance_of_time_in_words 并提供更准确的输出。

      【讨论】:

      • 是的,我使用过 dotiw,但似乎这会影响我项目的其他部分,所以我需要一些替代解决方案而不是 dotiw。但是感谢您的解决方案..
      • @sumit 如果冲突是 dotiw 更改了 distance_of_time_in_words 的输出,则可以添加 :vague 选项以使用原始格式,但 distance_of_time_in_words_hash 仍然可用。
      【解决方案3】:

      有一个宝石:time_diff

      https://rubygems.org/gems/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'}
      

      你应该能够从中得到你需要的东西。

      编码愉快!

      【讨论】:

      • 我在 gem "time_diff" 中遇到了兼容性问题。但是它安装成功仍然存在兼容性问题,我使用的是 Rails 2.3.2 和 ruby​​ ruby​​ 1.8.7。你能帮忙看看这个
      • 似乎 time_diff 使用了 2010 年 10 月 14 日发布的ActiveSupport v3.0.1(请参阅Gemfile.lock),而您使用的 Rails 版本在此之前发布:2.3.2 2009 年 3 月 15 日.那里可能有一些不兼容。所以有两种解决方案:我认为更新 Rails 或 gem 本身。 Ruby 版本没问题(它是由 gem 本身使用的)。而且,仅供参考,请知道不再支持 1.8.7:ruby-lang.org/en/news/2011/10/06/plans-for-1-8-7。希望这会有所帮助!
      • 实际上,对于我的项目,我使用的是 Rails 2.3.2。而且我无法升级它。所以我想知道是否可以将 time_diff gem 与 rails 2.3.2 一起使用。
      • 正如我之前的评论所说,ActiveSupport v3.0.1 似乎是 gem 所必需的。您必须检查您的 rails 2.3.2 版本中缺少的内容并更新需要的内容。我认为如果不修改代码,您将无法使其工作。如果您发布了尝试使 gem 工作时返回的错误,也许会有所帮助。
      • time_diff 有问题。似乎假设月份是 30 天,但事实并非如此。根据您的用例,这可能是一个问题,也可能不是。如果您还需要计算日期之间的月份和年份,这绝对是个问题。
      【解决方案4】:
      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
      

      【讨论】:

      • 此解决方案可能对我有用,但它给了我错误的两个日期之间的小时数,例如“Thu, 18 Jul 2013 11:30:00 +0000”和“Wed Jul 17 06:31” :44 +0000 2013" 它的返回 "-72.42713155" 你能解释一下两个连续日期之间的 72 小时差异是如何可能的吗?或者请给出提示,我怎样才能使它正常工作。
      • 按照上面的代码应该准确返回47。你到底在跑什么来获得-72.42713155?另外,我更新了上面的答案。
      • 上面的例子是给 47 你是对的。但是,如果您在两个日期之间取差,这与给出错误的小时数相比有很大的不同......好吧,感谢您的支持......
      • 把你使用的两个例子日期都给我,我会帮你解决的。
      猜你喜欢
      • 2011-03-20
      • 1970-01-01
      • 1970-01-01
      • 2011-03-19
      • 2013-07-24
      • 2010-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多