algorithm - 如何计算一个人的年、月、日年龄?

标签 algorithm datetime math

我想计算一个人的年龄,给定出生日期和当前日期相对于当前日期的年、月、日。

例如:

>>> 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/

相关文章:

algorithm - 这些情况下的 BFS 与 DFS?

math - 如何从字符串方程解析多项式

datetime - 如何从 DateTime Dart 对象获取一年中的某一天、一年中的第几周

Java更精确的算术

c++ - 通过向方向弯曲来转换线段

algorithm - big-O 时间复杂度中的指数分母(分数指数)从何而来?

algorithm - 使用 0 和 1 给定旋转角度绘制一个正方形

java - 计算链表中值的总和

php - 如何让周从星期日开始?

C# DateTime.ParseExact 为 "2012-09-03T06:35:31Z"