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


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

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

帅哥哟,离线,有人找我吗?
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编辑过]

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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2015/3/31 23:23:00 [只看该作者]

 参考代码

 

Dim birth As Date = new Date(2001, 4, 1)
Dim y As Integer = Date.Today.Year - birth.Year
If Date.Today < birth.AddYears(y) Then
    y = y - 1
End If

msgbox(y)


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


加好友 发短信
等级:管理员 帖子:47497 积分:251403 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2015/4/1 9:05:00 [只看该作者]

这里的方法二不行吗:

http://www.foxtable.com/help/topics/2647.htm

 


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


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

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

 回到顶部