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

标签 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 变成所需的所有步骤年龄 - 可以吗?

最佳答案

我认为这是家庭作业,所以让我尝试将您推向正确的方向,而不是简单地提供答案。

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

123456/100 = 1234
1234%100 = 34

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

您想要获得以年为单位的年龄(向下舍入),因此您需要减去两个 DateTime 值的 Year 属性。您还必须考虑此人今年是否已经过生日。


前方剧透

最大的 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 日庆祝他们的生日。

关于c# - 从社会安全号码计算年龄 - 如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9449680/

相关文章:

sql - Oracle:两次之间每半小时获取一次

c# - 如何设置 .NET WindowsAuthentication - 当我希望它使用实际用户时,名称总是显示为 "IIS APPPOOL\Classic .NET AppPool"

c# - 在 C# 中移动图像

javascript - JSON 日期格式自行更改

java - log4j2:日期/转换模式不起作用

c - 增加整数和初始化放置会产生奇怪的效果吗?

c++ - C 如何处理 char 和?

c++ - 如何将 C++ 字符串转换为 int?

C# NetSuite Web 服务 : Get value from custom field in saved search (ItemSearchAdvanced)

c# Soap 客户端问题 - 找到一个以上契约(Contract)的端点配置