C#格式化年龄-关于天、周、月-年

C#格式化年龄-关于天、周、月-年,c#,.net,visual-studio,formatting,C#,.net,Visual Studio,Formatting,我正在使用一些医疗软件,我需要根据以下规则以非常具体的方式输出所有年龄段的数据: 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#我正试图找到一种简单的方

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

 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#我正试图找到一种简单的方法,只要使用一个人的出生日期,任何帮助都将不胜感激。

我昨天也在做类似的事情,但类似的事情应该适合你的需要:(假设7天工作周,31天工作月,365天工作年等等)

修订方法:(根据Bob的建议固定)

公共静态字符串转换(日期时间dob)
{
DateTime today=DateTime.today;
字符串fmt=“{0:0}{1}”;
//大于2岁-输出年数

如果(dob您可以通过简单的减法获得表示用户当前年龄的对象:

TimeSpan age = DateTime.Now - dateOfBirth;
然后就是做一堆if子句的问题

if (age.TotalDays < 6 * 7) // 6 weeks
    // ...
else if (age.TotalDays < 6 * 30) // 6 months
    // ...
// et cetera
if(age.TotalDays<6*7)//6周
// ...
否则如果(age.TotalDays<6*30)//6个月
// ...
//等等

您应该能够了解如何进行格式设置。

可以从其他日期时间中减去日期时间类型,从而得到表示间隔的时间跨度。请尝试以下操作:

var timeAlive = DateTime.Today - dateOfBirth.Date;

然后,查看timeAlive的天、月和年(用天除以7表示周),并相应地设置格式。

以下内容不对天/月或年进行假设。
不利的一面是,它与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");
    }
publicstaticstringgetage(DateTime-dob){
DateTime today=DateTime.Now;
字符串fmt=“{0:0}{1}”;
if(dob
对于年计算,使用.years而不是.Days…..应该使计算正确地考虑闰年。+1将您的解决方案作为一种扩展方法来实现将是非常优雅的。@Andrew Good Point:),@Felice-在我最初的实现中,它是一个扩展方法,只是根据OP的需要对它进行了修改。TotalDays和TotalDays存储双倍(包括分数天)的天数之间的唯一区别不是吗?你认为这会对这个实现产生很大影响吗?我怀疑每月31天的假设(更不用说每年365天的假设)会使此方法无法正常工作,因为6个月的实际长度(以天为单位)完全取决于您所谈论的6个月。正确的方法是取出生日期,并将月值加上6(如果在6月30日之后,则折回并增加一年),然后以此作为参考日期来确定此人是否为6个月大。+1这是唯一一个代码完全符合规格的人。出于好奇,为什么它不兼容Y3K?它会兼容。我经常使用2位数的年份,并且经常写一些无法活过本世纪的东西。这在这里不适用。+1很好的函数tion Bob!(非常简洁)-但是我不认为它会考虑这个人今年是否已经过了生日。我输入自己的生日,发现我比实际年龄大一岁。如果您将年龄线更改为以下值,它将解决上述问题:if(dobvar timeAlive = DateTime.Today - dateOfBirth.Date;
    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");
    }