【问题标题】:C# Formatting Age - Regarding Days, Weeks , Months - YearsC# 格式化年龄 - 关于天、周、月 - 年
【发布时间】:2011-02-04 18:58:32
【问题描述】:

我正在开发一些医疗软件,我需要根据以下规则以非常具体的方式输出所有年龄:

 If under 6 Weeks old :  ###D (Number of Days)
If under 6 Months old :  ###W (Number of Weeks)
 If under 2 Years old :  ###M (Number of Months)
 If above 2 Years old :  ###Y (Number of Years)

使用 C# 我试图找到一个简单的方法来做到这一点,只使用一个人的出生日期,任何帮助将不胜感激。

【问题讨论】:

    标签: c# .net visual-studio formatting


    【解决方案1】:

    我昨天正在做类似的事情,但这样的事情应该适合您的需求:(假设每周 7 天、每月 31 天、每年 365 天等等。

    修改方法: (根据 Bob 的建议修复)

    public static string ConvertAge(DateTime dob)
        {
            DateTime today = DateTime.Today;
            string fmt = "{0:0##}{1}";
    
            //Greater than 2 Years old - Ouput Years
            if (dob <= today.AddYears(-2)) 
                return string.Format(fmt, (dob.DayOfYear <= today.DayOfYear) ? 
                (today.Year - dob.Year) : (today.Year - dob.Year)-1, "Y");
            //Less than 2 Years - Output Months
            if (dob < today.AddMonths(-2)) 
                return string.Format(fmt, (dob.DayOfYear <= today.DayOfYear) ? 
                (today.Year - dob.Year) * 12 + (today.Month - dob.Month) : 
                ((today.Year - dob.Year) * 12 + (today.Month - dob.Month))-1 , "M");
            //Less than 2 Months - Output Weeks
            if (dob < today.AddDays(-2 * 7)) 
                return string.Format(fmt, (today - dob).Days / 7, "W");
            //Less than 2 Weeks - Output Days
            return string.Format(fmt, (today - dob).Days, "D");
        }
    

    以前的方法:

    public string ConvertAge(DateTime dateOfBirth)
            {
                int daysOld = (DateTime.Now - dateOfBirth).Days;
    
                //Age < 6 Weeks
                if (daysOld < (6 * 7)) 
                    return String.Format("{0:0##}{1}", daysOld, 'D'); 
                //Age < 6 Months
                else if (daysOld < (6 * 31)) 
                    return String.Format("{0:0##}{1}", daysOld/7, 'W');
                //Age < 2 Years
                else if (daysOld < (2 * 365)) 
                    return String.Format("{0:0##}{1}", daysOld / 31, 'M');
                //Age >= 2 Years
                else 
                    return String.Format("{0:0##}{1}", daysOld / 365, 'Y');
            }
    

    希望这会有所帮助!

    【讨论】:

    • 对于岁数计算,使用 .Years 而不是 .Days..... 应该使计算正确考虑闰年。
    • +1 将您的解决方案实现为扩展方法会很优雅。
    • @Andrew Good Point :),@Felice - 在我最初的实现中,它是一种扩展方法,只是根据 OP 的需要对其进行了修改。
    • TotalDays 和 Days 之间的唯一区别不是 TotalDays 存储双精度数(包括小数天数)吗?您认为这会对这个实现产生很大影响吗?
    • 我怀疑每月 31 天的假设(更不用说每年 365 天的假设)会使这种方法无法正常工作,因为 6 个月的实际长度(以天为单位) period 完全取决于您所说的哪个 6 个月。正确的方法是取出生日期并将月份值加 6(如果在 6 月 30 日之后回绕并将年份加一),然后将其用作参考日期来确定此人是否为 6 个月大与否。
    【解决方案2】:

    可以从其他 DateTime 中减去 DateTime 类型,从而得到一个表示间隙的 TimeSpan。试试这个:

    var timeAlive = DateTime.Today - dateOfBirth.Date;
    

    然后,查看 timeAlive 的天、月和年(将天除以 7 表示周),并进行相应的格式化。

    【讨论】:

      【解决方案3】:

      以下内容不假设日/月或年。
      不利的一面是,它不兼容 Y3K。

          public static string GetAge (DateTime dob) {
              DateTime today = DateTime.Now;
              string fmt = "{0:0##}{1}";
      
              if (dob < today.AddYears(-2)) return string.Format(fmt, today.Year - dob.Year, "Y");
              if (dob < today.AddMonths(-6))return string.Format(fmt, (today.Year - dob.Year)*12 + (today.Month - dob.Month), "M");
              if (dob < today.AddDays(-6 * 7)) return string.Format(fmt, (today - dob).Days/7, "W");
              return string.Format(fmt, (today - dob).Days, "D");
          }
      

      【讨论】:

      • +1 这是唯一一个代码完全符合规范的。出于好奇,为什么它不兼容 Y3K?
      • 会的。我经常使用 2 位数的年份,并且经常写一些无法在世纪中幸存下来的东西。这不适用于这里。
      • +1 不错的功能鲍勃! (非常简洁) - 但是我不相信如果这个人的生日今年已经过去了。我输入了自己的生日,发现自己比实际年龄大一岁。
      • 如果您将 Age 行更改为以下内容,它将解决上述问题: if (dob
      • 你是对的。我专注于可变日/月和年的问题;我已经多次碰到这个问题。我应该评论说这是一个未经测试的功能,注定会有一个错误!好收获!
      【解决方案4】:

      你可以通过简单的减法得到一个代表用户当前年龄的对象:

      TimeSpan age = DateTime.Now - dateOfBirth;
      

      然后就是做一堆 if 子句的问题

      if (age.TotalDays < 6 * 7) // 6 weeks
          // ...
      else if (age.TotalDays < 6 * 30) // 6 months
          // ...
      // et cetera
      

      您应该能够弄清楚如何进行格式化。

      【讨论】:

        猜你喜欢
        • 2016-10-23
        • 1970-01-01
        • 2018-06-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-03
        • 2016-07-30
        • 2015-07-20
        相关资源
        最近更新 更多