Рубиновое вычитание даты - PullRequest
2 голосов
/ 29 марта 2011

У меня проблема с вычитанием даты в 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

Спасибо.

Ответы [ 2 ]

1 голос
/ 29 марта 2011

Я знаю, что это немного грязно, но вы пробовали:

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"
1 голос
/ 29 марта 2011

Вы можете попробовать эту ссылку:

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

ИЛИ

  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

Ссылка: В Rails отображение времени между двумя датами на английском языке

...