Mic*_*Fin 4 ruby datetime date date-of-birth ruby-on-rails-4
我的用户模型上有一个方法来计算用户的年龄并返回一个人类可读的字符串.我的用户可以在1个月及以上之间,因此返回的字符串会有所不同,具体取决于该人是"2个月大"还是"1岁"或"2岁3个月".
我已经回顾了几个SO帖子来解决这个问题.有什么我想念的吗?闰年?谢谢!
def age
dob = self.date_of_birth
# if a date of birth is not nil
if dob != nil
# get current date
now = Date.current
# has person had their birthday yet this year
had_birthday = ((now.month > dob.month || (now.month == dob.month && now.day >= dob.day)) ? true : false)
# if yes then subtract this year from birthday year, if not then also subtract 1 to get how many full years old they are
years = now.year - dob.year - (had_birthday ? 0 : 1)
# get the calendar month difference from birthdya calendar month and today's calendar month. if they have not had their birthdya yet then subtract the difference from 12
months = had_birthday ? now.month - dob.month : 12 - (now.month - dob.month)
# for under 1 year olds
if years == 0
return months > 1 ? months.to_s + " months old" : months.to_s + " month old"
# for 1 year olds
elsif years == 1
return months > 1 ? years.to_s + " year and " + months.to_s + " months old" : years.to_s + " year and " + months.to_s + " month old"
# for older than 1
else
return months > 1 ? years.to_s + " years and " + months.to_s + " months old" : years.to_s + " years and " + months.to_s + " month old"
end
# No date of birth saved so can not calculate age
else
return "No Date of Birth"
end
end
Run Code Online (Sandbox Code Playgroud)
您可以使用time_ago_in_words:
Class.new.extend(ActionView::Helpers::DateHelper).time_ago_in_words(Time.parse("1981-11-20"))
=> "over 34 years"
Run Code Online (Sandbox Code Playgroud)
编辑:我知道,它与您的解决方案的粒度不同。只是觉得这可能是一个很好的参考。
虽然这可能更好地发布到codereview网站,我仍然会给你我的想法.
你已经为一些较小的方法编写了一个相当长的方法.
首先,我会写一个方法,花费一个月的年数,并将其分成自己的函数.
def readable_age(years, months)
# for under 1 year olds
if years == 0
return months > 1 ? months.to_s + " months old" : months.to_s + " month old"
# for 1 year olds
elsif years == 1
return months > 1 ? years.to_s + " year and " + months.to_s + " months old" : years.to_s + " year and " + months.to_s + " month old"
# for older than 1
else
return months > 1 ? years.to_s + " years and " + months.to_s + " months old" : years.to_s + " years and " + months.to_s + " month old"
end
end
Run Code Online (Sandbox Code Playgroud)
但是,如果您不介意为项目添加一些依赖项,您可以利用actionview
gem,您可以利用该pluralize
功能.有点像
def readable_age(years, months)
year_text = ''
if years == 0
year_text = "#{years} #{pluralize('year', years)} and "
end
"#{year_text}#{pluralize('month', months)} old"
end
Run Code Online (Sandbox Code Playgroud)
现在为您的函数计算年数和月数.
def age(t)
dob = self.date_of_birth
months = (t.year * 12 + t.month) - (dob.year * 12 + dob.month)
# months / 12 will give the number of years
# months % 12 will give the number of months
readable_age(months / 12, 15 % 12)
end
Run Code Online (Sandbox Code Playgroud)
编辑
我将日期对象传递给age
函数的原因是允许您计算给定时间戳的人的年龄.如果在给定相同输入的情况下产生相同的结果,它还可以更容易地测试函数.
归档时间: |
|
查看次数: |
3196 次 |
最近记录: |