생일부터 사람의 나이를 받고 싶습니다. now - birthday / 365
몇 년 동안 366 일이 있기 때문에 작동하지 않습니다. 다음 코드를 생각해 냈습니다.
now = Date.today
year = now.year - birth_date.year
if (date+year.year) > now
year = year - 1
end
나이를 계산하는 더 많은 Ruby'ish 방법이 있습니까?
생일부터 사람의 나이를 받고 싶습니다. 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
true
|| 대신 1 false
?
이 솔루션이 잘 작동하고 다른 사람들이 읽을 수있는 것으로 나타났습니다.
age = Date.today.year - birthday.year
age -= 1 if Date.today < birthday + age.years #for days before birthday
쉽고 당신은 윤년 등을 처리에 대해 걱정할 필요가 없습니다.
Date.today.month < birthday.month or Date.today.month == birthday.month && Date.today.mday < birthday.mday
.
이것을 사용하십시오 :
def age
now = Time.now.utc.to_date
now.year - birthday.year - (birthday.to_date.change(:year => now.year) > now ? 1 : 0)
end
rails/activesupport
.
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.to_s(:number).to_i - birthday.to_date.to_s(:number).to_i)/1e4.to_i
또한 작동
(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 값을 유지하는 한 윤년에 대한 수당을 요구하지 않습니다.
birthday = DateTime.now - 1.year
불행히도, 365.25로 나누는 것은 조금 정확하지 않습니다.
난이게 좋아:
now = Date.current
age = now.year - dob.year
age -= 1 if now.yday < dob.yday
이 답변 이 가장 좋습니다. 대신 찬성하십시오.
나는 @philnash의 솔루션을 좋아하지만 조건부는 더 작을 수 있습니다. 부울식이하는 일은 사전 식 순서를 사용하여 [month, day] 쌍을 비교하는 것이므로 루비의 문자열 비교를 대신 사용할 수 있습니다.
def age(dob)
now = Date.today
now.year - dob.year - (now.strftime('%m%d') < dob.strftime('%m%d') ? 1 : 0)
end
(Date.today.strftime('%Y%m%d').to_i - dob.strftime('%Y%m%d').to_i) / 10000
?
이것은 이 답변 의 전환입니다 (많은 표를 받았습니다).
# convert dates to yyyymmdd format
today = (Date.current.year * 100 + Date.current.month) * 100 + Date.today.day
dob = (dob.year * 100 + dob.month) * 100 + dob.day
# NOTE: could also use `.strftime('%Y%m%d').to_i`
# convert to age in years
years_old = (today - dob) / 10000
그것은 접근 방식에서 독특하지만 그것이 무엇을하는지 알 때 완벽하게 이해됩니다.
today = 20140702 # 2 July 2014
# person born this time last year is a 1 year old
years = (today - 20130702) / 10000
# person born a year ago tomorrow is still only 0 years old
years = (today - 20130703) / 10000
# person born today is 0
years = (today - 20140702) / 10000 # person born today is 0 years old
# person born in a leap year (eg. 1984) comparing with non-leap year
years = (20140228 - 19840229) / 10000 # 29 - a full year hasn't yet elapsed even though some leap year babies think it has, technically this is the last day of the previous year
years = (20140301 - 19840229) / 10000 # 30
# person born in a leap year (eg. 1984) comparing with leap year (eg. 2016)
years = (20160229 - 19840229) / 10000 # 32
Ruby on Rails에 태그가 지정되어 있기 때문에 dotiw 젬은 Rails 내장 distance_of_times_in_words를 재정의 하고 연령을 판별하는 데 사용할 수있는 distance_of_times_in_words_hash 를 제공합니다 . 윤년은 연도 부분에서 잘 처리되지만 2 월 29 일은 세부 수준이 필요한지 이해해야하는 일 부분에 영향을 미칩니다. 또한 dotiw가 distance_of_time_in_words의 형식을 변경하는 방법이 마음에 들지 않으면 : vague 옵션을 사용하여 원래 형식으로 되돌립니다.
Gemfile에 dotiw를 추가하십시오 :
gem 'dotiw'
명령 행에서 :
bundle
distance_of_time_in_words 및 distance_of_time_in_words_hash에 액세스하려면 적절한 모델에 DateHelper를 포함하십시오. 이 예에서 모델은 '사용자'이고 생일 필드는 '생일'입니다.
class User < ActiveRecord::Base
include ActionView::Helpers::DateHelper
이 방법을 동일한 모델에 추가하십시오.
def age
return nil if self.birthday.nil?
date_today = Date.today
age = distance_of_time_in_words_hash(date_today, self.birthday).fetch("years", 0)
age *= -1 if self.birthday > date_today
return age
end
용법:
u = User.new("birthday(1i)" => "2011", "birthday(2i)" => "10", "birthday(3i)" => "23")
u.age
나는 이것이 기능적으로 @philnash의 대답과 동일하다고 생각하지만 IMO는 더 쉽게 이해할 수 있습니다.
class BirthDate
def initialize(birth_date)
@birth_date = birth_date
@now = Time.now.utc.to_date
end
def time_ago_in_years
if today_is_before_birthday_in_same_year?
age_based_on_years - 1
else
age_based_on_years
end
end
private
def age_based_on_years
@now.year - @birth_date.year
end
def today_is_before_birthday_in_same_year?
(@now.month < @birth_date.month) || ((@now.month == @birth_date.month) && (@now.day < @birth_date.day))
end
end
용법:
> BirthDate.new(Date.parse('1988-02-29')).time_ago_in_years
=> 31
이건 어때?
def age
return unless dob
t = Date.today
age = t.year - dob.year
b4bday = t.strftime('%m%d') < dob.strftime('%m%d')
age - (b4bday ? 1 : 0)
end
이것은 레일을 사용 age
하고 모델 에서 메소드를 호출 하고 모델에 날짜 데이터베이스 열 이 있다고 가정 합니다 dob
. 이 방법은 문자열을 사용하여 올해 생일 전에 있는지 확인하기 때문에 다른 답변과 다릅니다.
예를 들어 dob
2004/2/28이고 today
2014/2/28 인 age
경우 2014 - 2004
또는 10
입니다. 수레는 0228
과 0229
입니다. b4bday
것 "0228" < "0229"
또는 true
. 마지막으로, 우리는 차감됩니다 1
에서 age
얻을 9
.
이것이 두 번 비교하는 일반적인 방법입니다.
def age
return unless dob
t = Date.today
age = today.year - dob.year
b4bday = Date.new(2016, t.month, t.day) < Date.new(2016, dob.month, dob.day)
age - (b4bday ? 1 : 0)
end
이것은 동일하게 작동하지만 b4bday
줄이 너무 깁니다. 2016
년은 필요하지 않습니다. 처음에 문자열 비교 결과입니다.
당신은 또한 이것을 할 수 있습니다
Date::DATE_FORMATS[:md] = '%m%d'
def age
return unless dob
t = Date.today
age = t.year - dob.year
b4bday = t.to_s(:md) < dob.to_s(:md)
age - (b4bday ? 1 : 0)
end
레일을 사용하지 않는 경우 다음을 시도하십시오
def age(dob)
t = Time.now
age = t.year - dob.year
b4bday = t.strftime('%m%d') < dob.strftime('%m%d')
age - (b4bday ? 1 : 0)
end
def computed_age
if birth_date.present?
current_time.year - birth_date.year - (age_by_bday || check_if_newborn ? 0 : 1)
else
age.presence || 0
end
end
private
def current_time
Time.now.utc.to_date
end
def age_by_bday
current_time.month > birth_date.month
end
def check_if_newborn
(current_time.month == birth_date.month && current_time.day >= birth_date.day)
end```
def birthday(user)
today = Date.today
new = user.birthday.to_date.change(:year => today.year)
user = user.birthday
if Date.civil_to_jd(today.year, today.month, today.day) >= Date.civil_to_jd(new.year, new.month, new.day)
age = today.year - user.year
else
age = (today.year - user.year) -1
end
age
end
특정 날짜의 나이를 계산할 수있는 내 솔루션은 다음과 같습니다.
def age on = Date.today
(_ = on.year - birthday.year) - (on < birthday.since(_.years) ? 1 : 0)
end
나도 이것을 다루어야했지만 몇 달 동안. 너무 복잡해졌습니다. 내가 생각할 수있는 가장 간단한 방법은 다음과 같습니다.
def month_number(today = Date.today)
n = 0
while (dob >> n+1) <= today
n += 1
end
n
end
12 개월로도 동일한 작업을 수행 할 수 있습니다.
def age(today = Date.today)
n = 0
while (dob >> n+12) <= today
n += 1
end
n
end
Date 클래스를 사용하여 월을 늘리면 28 일 및 윤년 등을 처리합니다.