Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在ruby中获取两个日期之间的月数、年数_Ruby - Fatal编程技术网

在ruby中获取两个日期之间的月数、年数

在ruby中获取两个日期之间的月数、年数,ruby,Ruby,我正在尝试编写web ui测试,根据用户输入从jquery日历中选择日期(watir webdriver),如何在两个给定日期之间找到年数月,我搜索了几个解决方案无法得到我想要的 date1=Date::strtime(“2013-09-19,%Y-%m-%d”) date2=日期::strTime(“2013-09-25”,%Y-%m-%d”) date3=日期::strTime(“2013-10-01”,%Y-%m-%d”) date4=日期::strTime(“2014-01-20”,“Y

我正在尝试编写web ui测试,根据用户输入从jquery日历中选择日期(watir webdriver),如何在两个给定日期之间找到年数月,我搜索了几个解决方案无法得到我想要的

date1=Date::strtime(“2013-09-19,%Y-%m-%d”)
date2=日期::strTime(“2013-09-25”,%Y-%m-%d”)
date3=日期::strTime(“2013-10-01”,%Y-%m-%d”)
date4=日期::strTime(“2014-01-20”,“Y-%m-%d”)
date5=日期::strTime(“2014-12-01”,“Y-%m-%d”)
所需输出

diff between date1,date2 -- 0 yrs, 0 month(s)  
diff between date1,date3 -- 0 yrs, 1 month(s)  
diff between date1,date4 -- 0 yrs, 4 month(s)  
diff between date1,date5 -- 1 yrs, 3 month(s)  

我还检查了时间差异,我会以月为单位计算差异(请注意,我们在这里忽略了日差异),然后将该数字除以12来计算年数:

##
# Calculates the difference in years and month between two dates
# Returns an array [year, month]
def date_diff(date1,date2)
  month = (date2.year * 12 + date2.month) - (date1.year * 12 + date1.month)
  month.divmod(12)
end

date_diff date1, date4 #=> [0, 4]
date_diff date1, date2 #=> [0, 0]
date_diff date1, date3 #=> [0, 1]
date_diff date1, date5 #=> [1, 3]

这是我的尝试。在多个单元中工作:

  def date_diff(date1, date2, units=:months)
    seconds_between = (date2.to_i - date1.to_i).abs
    days_between = seconds_between / 60 / 60 / 24

    case units
      when :days
        days_between.floor
      when :months 
        (days_between / 30).floor
      when :years
        (days_between / 365).floor
      else
        seconds_between.floor
    end
  end
用法:

date_diff(Time.now, 10.years.ago - 77.days, :years)  #=> 10 
date_diff(10.years.ago - 77.days, Time.now, :months) #=> 124
date_diff(10.years.ago - 77.days, Time.now, :days)   #=> 3730
我从网站上拿了这个,但是效果很好,我想我可以和大家分享。如果您使用的是Rails,请使用以下代码创建一个名为
TimeDifference
的类:

类时差
私有类方法:新
定义自我之间(开始时间:,结束时间:)
新建(开始时间、结束时间)
结束
def(单位:秒)
@时差
结束
def(单位:分钟)
in_分量(:分钟)
结束
def(单位:小时)
in_分量(:小时)
结束
def(单位:天)
in_组件(:天)
结束
def(单位:周)
in_分量(:周)
结束
def(单位:个月)
(@time_diff/(1.day*30.42)).轮(2)
结束
十年后
单位构成(年)
结束
私有的
def初始化(开始时间、结束时间)
开始时间=以秒为单位的时间(开始时间)
结束时间=以秒为单位的时间(结束时间)
@时间差=(结束时间-开始时间).abs
结束
def时间(单位:秒)(时间)
时间到了
结束
def in_部件(部件)
(@time_diff/1.send(组件)).round(2)
结束
结束
然后简单地打电话:

start\u time=DateTime.parse('1999年6月2日9:00:00')
end_time=DateTime.parse('2021年4月19日9:00:00')
时差=时差(
开始时间:开始时间,
结束时间:结束时间
)
时间差(单位:天)
=> 7992.0
时间差(以月为单位)
=> 262.72
时间差(单位:年)
=> 21.88

注意:如果您不使用Rails,您可能需要ActiveSupport。

可能与您在
time\u diff
gem中尝试的内容重复?我认为您可以将其应用于
dateN.to\u time
值。
month.divmod(12)
[month/12,month%12]
的缩写。此解决方案似乎仅在date2晚于date1时有效:
date\u diff date5,date1
返回[-2,9]