2011-03-29 116 views
2

我有约会减法的问题在Ruby中红宝石日期减法

"2011-03-29".to_date - "2011-03-20".to_date #=> (9/1) 
("2011-03-29".to_date - "2011-03-20".to_date).to_i #=> 9 

似乎它返回的天数日期之间的差值。

现在我的问题是返回的年数,月,日差

ie ("2011-03-29".to_date - "2011-03-20".to_date) 

的日子应该返回

0 years, 0 month and 9 days 

感谢。

+0

你正在使用哪种库或框架,为字符串提供'to_date'方法? Rails的?还有别的吗? – maerics 2011-03-29 08:23:37

回答

1

你可以试试这个链接:

http://api.rubyonrails.org/classes/ActionView/Helpers/DateHelper.html#method-i-distance_of_time_in_words

OR

def time_diff_in_natural_language(from_time, to_time) 
    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) 
    distance_in_seconds = ((to_time - from_time).abs).round 
    components = [] 

    %w(year month week day).each do |interval| 
     # For each interval type, if the amount of time remaining is greater than 
     # one unit, calculate how many units fit into the remaining time. 
     if distance_in_seconds >= 1.send(interval) 
     delta = (distance_in_seconds/1.send(interval)).floor 
     distance_in_seconds -= delta.send(interval) 
     components << pluralize(delta, interval) 
     end 
    end 

    components.join(", ") 
    end 

    time_diff_in_natural_language(Time.now, 2.5.years.ago) 
    >> 2 years, 6 months, 2 days 

参考:In Rails, display time between two dates in English

+0

请不要防守编程 – Reactormonk 2011-03-29 08:47:12

+1

防守?请详细说明。 – 2011-03-29 09:03:30

+0

我知道它是什么意思......就像我有时间检查to_time方法。正确的塔斯? – Ashish 2011-03-29 09:09:31

1

我知道这是有点脏,但你尝试过:

result = Date.new(0) + ("2011-03-29".to_date - "2011-03-20".to_date) 
puts "#{result.year} years, #{result.month - 1} months and #{result.day} days" 
+0

我想你错过了#{result.month-1},这是因为Date.new(0)以1月为一个月。 – a5his 2011-03-29 10:26:20

+0

你说得对。几个月开始1.我刚刚更新了答案。韩国社交协会。 – Edu 2011-03-30 08:44:15