Foxtable(狐表)用户栏目专家坐堂 → 如何精确地计算一个人的年龄


  共有3632人关注过本帖树形打印复制链接

主题:如何精确地计算一个人的年龄

帅哥哟,离线,有人找我吗?
vincen
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:婴狐 帖子:3 积分:86 威望:0 精华:0 注册:2015/3/31 21:51:00
如何精确地计算一个人的年龄  发帖心情 Post By:2015/3/31 22:47:00 [显示全部帖子]

作为一个新手,正在学习foxtable,  在如何自动获取一个人的年龄时,我参考了论坛中的各种帖子,包括软件的帮助文档,通常用的最多的是下面的方法

If e.DataCol.Name = "身份证号" Then
    Dim dr As DataRow = e.DataRow
    If dr.IsNull("身份证号") Then
        dr("出生日期") = Nothing
        dr("年龄") = Nothing
    Else
        dr("出生日期") = ReadBirthday(dr("身份证号"))
        Dim t As TimeSpan = today - CDate(dr("出生日期"))
        dr("年龄") = math.floor(Math.Round(t.TotalDays / 365.2422,8))   '将用math.floor取整,使年龄数值更符合实际习惯
    End If
End If


其中 dr("年龄") = math.floor(Math.Round(t.TotalDays / 365.2422,8))   '将用math.floor取整,使年龄数值更符合实际习惯   这句是我测试了多次真实数据后改进的语句,原本是没有使用math.floor()函数的,发现在计算年龄时会有误差,可能这是因为我们用间隔时间差来除以365.2422,当积累到一定数值后,误差就出现了,后来我将后面的小数位改为8位,然后将年龄改为高精度小数后取整,发现生日当天以及生日的前后一天,在计算年龄时还是会出现误差,当然,这里我个人坚持生日当天即为满周岁,  比如2001年3月31日出生的人, 在2015年3月31号这天,程序计算其年龄应该是14岁,但是实际上却计算成了13岁,为了实现更高准确的计算年龄, 我想到了日期比较,DateYMD()可以比较两个日期相隔的年数,月数,以及天数,如果我们只看年数部分,其实就可以当成是一个人的准确年龄。代码如下:

Dim y,m,d As Integer


If e.DataCol.Name = "身份证号" Then
    Dim dr As DataRow = e.DataRow
    If dr.IsNull("身份证号") Then
        dr("出生日期") = Nothing
        dr("年龄") = Nothing
    Else
        dr("出生日期") = ReadBirthday(dr("身份证号"))
          DateYMD( CDate(dr("出生日期")),Date.Today,y,m,d)  '比较转换为日期格式的出生日期(从身份证中提取,)与当前日期相隔的年,月,日数,

        dr("年龄") = y       '将比较后得出的年数看作为年龄,生日当天满周岁。
    End If
End If

[此贴子已经被作者于2015/3/31 23:00:33编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
vincen
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:婴狐 帖子:3 积分:86 威望:0 精华:0 注册:2015/3/31 21:51:00
  发帖心情 Post By:2015/3/31 22:51:00 [显示全部帖子]

If e.DataCol.Name = "身份证号" Then
    Dim dr As DataRow = e.DataRow
    If dr.IsNull("身份证号") Then
        dr("出生日期") = Nothing
        dr("年龄") = Nothing
    Else
        dr("出生日期") = ReadBirthday(dr("身份证号"))
        Dim t As TimeSpan = today - CDate(dr("出生日期"))
        dr("年龄") = math.floor(Math.Round(t.TotalDays / 365.2422,8))   '将用math.floor取整,使年龄数值更符合实际习惯
    End If
End If


这段代码实现方式已经实现了多数年份年龄的计算准确性,但像2001年3月31日出生,在2015年3月31日这天却还是计算成了13岁,产生了误差。使用日期比较就可以消除生日当天这个年龄计算误差。
[此贴子已经被作者于2015/3/31 22:51:50编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
vincen
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:婴狐 帖子:3 积分:86 威望:0 精华:0 注册:2015/3/31 21:51:00
  发帖心情 Post By:2015/4/1 22:29:00 [显示全部帖子]

嗯,方法一的方式会有误差,方法二就准确多了

 回到顶部