引子
对于一个,极端追求完美的程序员,写代码,有时候是很痛苦的。这种痛苦不是怎么实现一个需求,而是痛苦于选择,选择用那种方法实现,才能做到完美。
——今天,天气闷热,要下大雨的样子,股票行情持续走低,大盘接近2700点。
问题描述
最近做项目有一个需求,需要通过出生日期计算年龄。当听到这个需求,我最直观的想法就是,出生年份与系统年份做差再加一,得到的年龄(自认为简单粗暴,计算准确【按虚岁】)。可是当和其他同事讨论的时候,说一般情况按照周岁计算,比较合适。正当和同事讨论的时候,忽然另一同事问到,虚岁和周岁的概念是怎么定义的?我之前也只是模糊的知道,真被同事问起来,我也是懵逼的(生活中处处是学问)。
虚岁是中国传统的计龄方式,也流行于亚洲东部其它国家,用于计算人出生后正在经历的年份次序(序数),以刚出生时为一岁,因为这是人出生后的第一年,与已经历过的怀孕近一年无关。按照农历【摘自百科】
周岁,是国际通用的年龄计算方式。它计算的是出生后已经度过的时间长度(为基数,故也可以计算尾数,如三岁零两个月,七岁半等)。按照公历【摘自百科】。
经过以上对虚岁和周岁概念的理解我们可以得到下表(简化按照公历计算):
出生日期 \ 系统当前时间 | 虚岁 | 周岁 |
---|---|---|
2017-07-07 \2018-02-02 | 2 | 0岁6个月26天 |
2017-07-07 \2018-08-07 | 2 | 1岁1个月 |
2017-07-07 \2019-07-02 | 3 | 1岁11个月26天 |
由于我们项目中的需求,对年龄为整数显示,没有月数和日数,最后讨论,用周岁显示,但只显示几周岁,月数和日数舍去,零周岁显示一岁。
实现代码如下:
int GetAge(STPerItem *st, CDeviceInfo *m_Device) {
int nAge = m_Device->nSysYear - st->nYear;
if (nAge <= 0) {
nAge = 1;
} else {
if (m_Device->nMonth < st->nMonth) {
nAge -= 1;
} else if (m_Device->nMonth == st->nMonth) {
if (m_Device->nDay < st->nDay) {
nAge -= 1;
}
}
}
return nAge;
}
总结:
解决问题之前,一定要搞懂所有相关概念(切记概念模糊),只有做到胸中有数,才能完美解决问题。