新手问题 Ruby 的年龄计算

dudu_zzzz · 2015年10月13日 · 最后由 blacktulip 回复于 2015年10月13日 · 2641 次阅读

today = Date.today birth = date_of_birth (date_of_birth也是一个Date)

想要精确计算出年龄 x岁x月x天

各位前辈们有什么好的方法么?

共收到 8 条回复

没法算出来。因为你没定义一个月按30天算还是31天算。

> years, days = ((Time.now - Time.new(1999, 01, 01))/3600/24).round.divmod(365)
 => [16, 290]

可以算出来,1999年01月01日出生的人到今天是16岁290天。

#1楼 @est 你没有考虑闰年和平年。

year = 0.upto(100).find { |y| (y + 1).years.ago < birth }
month = 0.upto(11).find { |m| (m + 1).months.ago < birth + year.years }
day = 0.upto(30).find { |d| (d + 1).days.ago < birth + year.years + month.months }

直觉上可以数出来,不过比较低效

借位算术

born = Time.new 1999, 1, 1
now = Time.now

d = now.day - born.day
if underflow = (d < 0)
  d += 30
end

m = now.month - born.month
m -= 1 if underflow
if underflow = (m < 0)
  m += 12
end

y = now.year - born.year
y -= 1 if underflow

puts "#{y}#{m}#{d}天"

或者 time diff hack:

born = Time.new 1999, 1, 1
now = Time.now
time_diff = Time.at(now - born + (born.year - 1970).years).utc
y, m, d, h, mm, s = time_diff.strftime("%Y %m %d %H %M %S").split.map &:to_i
puts "#{y-born.year}#{m-1}#{d-1}#{h}小时#{mm}#{s}秒"

如果一个人在2000年2月29日出生,到了2001年2月28日,算几岁几月几天?

#2楼 @yunshang 严格的来说,你是对的。如果更加严格,还要考虑润秒,时区,夏时令和基督教改年的问题。。。。。。。

#7楼 @juanito 这个好,我记得wa是有api用的

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册