C# Formatting Age - Regarding Days, Weeks , Months - Years

后端 未结 4 1614
心在旅途
心在旅途 2021-01-18 02:20

I am working on some medical software and I am required to output all ages in a very specific manner, based on the following rules:

 If under 6 Weeks old :           


        
相关标签:
4条回答
  • 2021-01-18 02:53

    I was working on something similar yesterday, but something like this should suit your needs: (assuming 7 day weeks, 31 day months, 365 day years etc.)

    Revised Method : (Fixed as per Bob's suggestions)

    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");
        }
    

    Previous Method :

    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');
            }
    

    Hope this helps!

    0 讨论(0)
  • 2021-01-18 02:53

    A DateTime type can be subtracted from other DateTimes, resulting in a TimeSpan representing the gap. Try this:

    var timeAlive = DateTime.Today - dateOfBirth.Date;
    

    Then, look at the Days, Months and Years (divide Days by 7 for Weeks) of timeAlive, and format accordingly.

    0 讨论(0)
  • 2021-01-18 03:02

    The following makes no assumptions about days/months or year.
    On the downside, it is not Y3K compatible.

        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");
        }
    
    0 讨论(0)
  • 2021-01-18 03:04

    You can get an object representing the user's current age with a simple subtraction:

    TimeSpan age = DateTime.Now - dateOfBirth;
    

    And then it's just a matter of doing a bunch of if clauses

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

    You should be able to figure out how to do your formatting.

    0 讨论(0)
提交回复
热议问题