[ruby-on-rails] 루비에서 사람의 나이를 얻으십시오

생일부터 사람의 나이를 받고 싶습니다. now - birthday / 365몇 년 동안 366 일이 있기 때문에 작동하지 않습니다. 다음 코드를 생각해 냈습니다.

now = Date.today
year = now.year - birth_date.year

if (date+year.year) > now
  year = year - 1
end

나이를 계산하는 더 많은 Ruby’ish 방법이 있습니까?



답변

나는 여기서 파티에 늦었다는 것을 알고 있지만, 윤년에 2 월 29 일에 태어난 사람의 나이를 운동하려고 할 때 받아 들여지는 대답은 끔찍하게 깨질 것입니다. 호출 birthday.to_date.change(:year => now.year)날짜가 잘못 되었기 때문 입니다.

대신 다음 코드를 사용했습니다.

require 'date'

def age(dob)
  now = Time.now.utc.to_date
  now.year - dob.year - ((now.month > dob.month || (now.month == dob.month && now.day >= dob.day)) ? 0 : 1)
end


답변

이 솔루션이 잘 작동하고 다른 사람들이 읽을 수있는 것으로 나타났습니다.

    age = Date.today.year - birthday.year
    age -= 1 if Date.today < birthday + age.years #for days before birthday

쉽고 당신은 윤년 등을 처리에 대해 걱정할 필요가 없습니다.


답변

이것을 사용하십시오 :

def age
  now = Time.now.utc.to_date
  now.year - birthday.year - (birthday.to_date.change(:year => now.year) > now ? 1 : 0)
end


답변

Ruby on Rails (ActiveSupport)의 하나의 라이너. 윤년, 윤초 등을 처리합니다.

def age(birthday)
  (Time.now.to_s(:number).to_i - birthday.to_time.to_s(:number).to_i)/10e9.to_i
end

여기에서 논리 -C #에서 나이 계산

호출 할 경우 두 날짜, 같은 시간대에 가정 utc()전에 to_s()모두.


답변

(Date.today.strftime('%Y%m%d').to_i - dob.strftime('%Y%m%d').to_i) / 10000


답변

지금까지의 답변은 다소 이상합니다. 원래 시도는 이것을 수행하는 올바른 방법에 매우 가깝습니다.

birthday = DateTime.new(1900, 1, 1)
age = (DateTime.now - birthday) / 365.25 # or (1.year / 1.day)

소수의 결과를 얻을 수 있으므로을 사용하여 결과를 정수로 자유롭게 변환하십시오 to_i. 이벤트 이후 날짜 차이를 일 (또는 관련 Time 클래스의 경우 초) 단위로 측정 된 시간으로 올바르게 처리하므로 더 나은 솔루션입니다. 그런 다음 일년에 일 수로 간단한 나눗셈을하면 나이가됩니다. 이러한 방식으로 연령을이 방법으로 계산할 때는 원래 DOB 값을 유지하는 한 윤년에 대한 수당을 요구하지 않습니다.


답변

나의 제안:

def age(birthday)
    ((Time.now - birthday.to_time)/(60*60*24*365)).floor
end

요령은 Time을 사용한 마이너스 연산이 초를 반환한다는 것입니다.