从社会安全号码计算年龄 - 如何?

时间:2012-02-26 01:17:53

标签: c# date int

我对C#很陌生并得到了这个任务。我有一个名为person的课程,里面有一些细节,其中一个是社会安全号码(CPR号码)。从这个数字我需要计算这个人的年龄。根据作业,如果我理解的话,它需要适合这个:

public class Person
{
    int _Cpr;

    public int Age
    {
        get
        {
            return (age calculation from cpr number somehow)
        }
    }
}

但是我不知道该怎么做 - 我猜我需要将具有这种形式的社会安全号整数:DDMMYYXXXX与当前日期进行比较,并在舍入的年份中返回差异 - 但我不知道怎么做。


我开始了解如何计算年龄 - 我仍然迷失的是,如何将其融入我的代码中。我的描述说Age应该是一个“计算属性” - 但据我所知,我不能创建在类定义中使用的变量,所以我不能真正做到使Cpr成为所需的所有步骤年龄 - 我可以吗?

4 个答案:

答案 0 :(得分:3)

我认为这是作业,所以让我试着把你推向正确的方向而不是简单地提供答案。

您必须从社会安全号码中提取出生日期。通过以10的幂进行整数除法,您可以从右侧“切割”数字。通过以10的幂进行模运算,您可以保留所需的位数:

123456/100 = 1234
1234%100 = 34

在C#中,您可以使用DateTime类来表示某个时间点(例如出生日期)。字段DateTime.Now包含当前时间。

您希望获得多年的年龄(向下舍入),这样您就可以减去两个Year值的DateTime属性。如果这个人今年已经过生日,你还必须考虑到这一点。


Spoiler提前

最大CPR为3112999999,该数字实际上大于Int32.MaxValue。这意味着您必须将_Cpr的类型更改为uint(或long)。下面的代码还考虑了TheKaneda描述的从两位数年份获得四位数年份的规则。

public class Person       
{       
  uint _Cpr;       

  public int Age       
  {       
    get       
    {       
      int century = (int) ((cpr/1000)%10);

      int shortBirthYear = (int) ((cpr/10000)%100);
      int birthYear = 1900 + shortBirthYear;
      if ((century == 4 || century == 9) && shortBirthYear <= 36)
        birthYear += 100;
      else if (5 <= century && century <= 8 && shortBirthYear <= 57)
        birthYear += 100;

      int birthMonth = (int) ((cpr/1000000)%100);

      int birthDayOfMonth = (int) ((cpr/100000000));

      DateTime birthDate = new DateTime(birthYear, birthMonth, birthDayOfMonth);
      DateTime today = DateTime.Now.Date;
      DateTime birthDay = new DateTime(today.Year, birthMonth, birthDayOfMonth);

      int birthdayAdjustment = today < birthDay ? -1 : 0;
      int age = today.Year - birthDate.Year + birthdayAdjustment;
    }
  }
}

即使代码非常复杂,它也无法处理2月29日某人出生的情况。为了改进代码,应将其重构为单独的部分,以处理提取出生日期和计算年龄。最后一部分应该处理2月29日的问题,根据文化,你可能会发现在非闰年,2月29日出生的人在2月28日庆祝他们的生日。

答案 1 :(得分:2)

除了其他人所写的内容之外,请注意理想情况(对于生产用途,虽然您的作业可能不需要),但您需要检查第7位以说明出生世纪。

ddmmyy-Cxxx
C = 0-3 => person was born in the 1900's
C = 4 or 9 => person was born either 2000-2036 or 1937-1999
C = 5-8 => person was born either 2000-2057 or 1858-1899

答案 2 :(得分:0)

结帐System.DateTimeConvert.ToDateTime()

我相信你可以从那里拿走它。

答案 3 :(得分:0)

我不会给你你需要的确切代码,因为这看起来像是家庭作业,但我会给你一些线索。

首先,DDMMYYYYXXXX格式的CPR编号看起来像一个int,但实际上它不是一个。您可以将其视为具有4个不同字段(D,M,Y,X)的结构或字符串。但是,最方便的可能是随后的提示。

您可以将。{中由DateTime结构体表示的日期转换为带有ToString( string format)方法的字符串,您可以指定自定义格式。您可以使用ParseExact方法执行相反的操作。

现在,如果你有生日,计算年龄应该很容易。如果我们在今年的生日之后,它等于当前年份和出生年份之间的差异,否则等于一年。实施它应该不会太困难。