Вычитание даты с Руби - PullRequest
       48

Вычитание даты с Руби

16 голосов
/ 14 ноября 2010

Я просто смотрю на ruby ​​и играю с датой / временем.

irb(main):001:0> jamis_DOB = Time.mktime(2003, 10, 22, 06, 59)
=> Wed Oct 22 06:59:00 +0300 2003
irb(main):002:0> age = Time.now - jamis_DOB
=> 222934108.172989
irb(main):005:0> age_in_years = (((age / 3600) / 24) / 365).to_i
=> 7

Так что мой пример не так хорош, как age_in_years не будет знать, есть ли високосные годы, когда эти годы складываются.Я прошел некоторые уроки по гуглу и датам и не нашел простого способа просто вычесть две даты и вернуть их в формате лет, месяцев, дней и т. Д. ...Я предполагаю, что у ruby ​​есть дополнение или что-то встроенное для такого рода вещей.Может кто-нибудь сказать мне, что это?(Кроме того, любой совет, как найти ответы на этот тип вещи для дальнейшего использования?)

Спасибо.

1 Ответ

33 голосов
/ 14 ноября 2010

Вы хотите Date вместо Time:

require 'date'

now = Date.today
before = Date.civil(2000, 1, 1)
difference_in_days = (now - before).to_i

(difference_in_days/365.25).to_i

Даст вам разницу в годах между сегодняшним днем ​​и 1 января 2000 года.может быть улучшен, я просто использовал среднее количество дней в году (365,25), что даст вам правильный ответ, за исключением крайних случаев.

Вы также можете сделать что-то вроде этого:

require 'date'

years = 0
d = Date.civil(2000, 1, 1)
loop do
  d = d.next_year
  break if Date.today < d
  years += 1
end

Но Date#next_year был введен в Ruby 1.9, поэтому он не будет работать в 1.8.7.

Конечно, самый простой способ определить количество лет между двумя датами - просто вычестьцифры:

2010 - 2000 # => 10
...