新手问题 Ruby 的年龄计算

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

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

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

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

没法算出来。因为你没定义一个月按 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 用的

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