我想计算一个人的年龄,给定出生日期和当前日期相对于当前日期的年、月、日。
例如:
>>> calculate_age(2008, 01, 01)
1 years, 0 months, 16 days
任何指向执行此操作的算法的指针都将不胜感激。
最佳答案
首先,请注意以下假设:例如,如果您出生于 2 月 1 日,那么您正好是 1 个月大,即使您的天数只有 28 天 -- 小于平均一个月。年份也有可变长度(由于闰年),这意味着您生日时的年龄通常不是精确的整数年数。如果您想以年/月/天的形式表达您活着的确切时间,请参阅我的其他答案。但更有可能的是你想恰到好处地捏造它,所以在 2 月 1 日出生意味着每年 2 月 1 日你是 X 岁 0 个月零天,而在任何一个月的 1 日你是 X 岁,Y 个月,和 0 天。
在这种情况下,请继续阅读。 (注意:以下仅适用于过去的日期。)
给定出生日期 (y,m,d)
、当前日期 (ynow,mnow,dnow)
和一个函数 tm ()
给出 unix/epoch time for a given date ,以下将输出一个 3 元素列表,其中年龄为 {years, months, days}:
t0 = y*12 + m - 1; # total months for birthdate.
t = ynow*12 + mnow - 1; # total months for Now.
dm = t - t0; # delta months.
if(dnow >= d) return [floor(dm/12), mod(dm,12), dnow-d];
dm--; t--;
return [floor(dm/12), mod(dm,12),
(tm({ynow,mnow,dnow}) - tm({floor(t/12), mod(t,12)+1, d}))/60/60/24];
如果您不喜欢所有楼层和模组,以下是等效算法。但我认为上面的更好。一方面,它避免在不需要时调用 tm()
。
{yl, ml} = {ynow, mnow};
if(mnow < m || mnow == m && dnow < d) yl--;
if(dnow < d) ml--;
years = yl - y;
months = ml + 12*(ynow - yl) - m;
yl = ynow;
if(ml == 0) { ml = 12; yl--; }
days = (tm({ynow, mnow, dnow}) - tm({yl, ml, d}))/60/60/24;
return [years, months, days];
关于algorithm - 如何计算一个人的年、月、日年龄?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/453208/