2012-04-08 108 views
1

我需要帮助来显示这样的内容。如果您认识到,这是我们的Stack Overflow帐户的会员资格。使用Timespan显示总持续时间

member for 2 years, 3 months 

我需要稍微修改一下。我的条件和显示格式如下:

Conditions    Display Format 
1. Below 7 days ->  Days (5 days) 
2. 7 -30 days ->  Weeks, days (2 Weeks, 3 Days) in case of 17 days. 
3. 30 - 365  ->  Months, Weeks, Days (4Months, 2Weeks, 2Days) in case of 136 days 
3. 365 or grter ->  Years, Months only (2years, 3 Months) 

What I did: 

我使用Timespan来获取日期差异。但我对我的输出不满意。我有一个会员,注册时间在2-3天后才会变为2个月,但仍在1个月前显示。这里是我的代码:

TimeSpan ts = DateTime.Now - Convert.ToDateTime(company.RegistrationDate); 

       if (ts.Days > 365) 
        membersince.InnerText = string.Format("{0} years", (ts.Days/365)); 
       else if (ts.Days < 30) 
        membersince.InnerText = string.Format("{0} days", ts.Days); 
        else if(ts.Days > 30) 
        membersince.InnerText = string.Format("{0} months", (ts.Days/30)); 
+0

你有没有经过调试器? – 2012-04-08 14:19:33

+0

在你的问题中,它给出了“我有一个成员的注册将在2-3天后进入2个月,但仍然在1个月前显示”。由于现在还没有2个月,1个月的输出是否应该正确? – 2012-04-08 14:24:38

+0

Duplicate http://stackoverflow.com/questions/9594583/birthday-age-calculation-but-also-for-number-of-months-and-days/9594788#9594788 – 2012-04-08 14:27:32

回答

3

可以使用则DateDiffTime Period Library for .NET库:

// ---------------------------------------------------------------------- 
public void DateDiffSample() 
{ 
    DateTime date1 = new DateTime(2009, 11, 8, 7, 13, 59); 
    Console.WriteLine("Date1: {0}", date1); 
    // > Date1: 08.11.2009 07:13:59 
    DateTime date2 = new DateTime(2011, 3, 20, 19, 55, 28); 
    Console.WriteLine("Date2: {0}", date2); 
    // > Date2: 20.03.2011 19:55:28 

    DateDiff dateDiff = new DateDiff(date1, date2); 

    // elapsed 
    Console.WriteLine("DateDiff.ElapsedYears: {0}", dateDiff.ElapsedYears); 
    // > DateDiff.ElapsedYears: 1 
    Console.WriteLine("DateDiff.ElapsedMonths: {0}", dateDiff.ElapsedMonths); 
    // > DateDiff.ElapsedMonths: 4 
    Console.WriteLine("DateDiff.ElapsedDays: {0}", dateDiff.ElapsedDays); 
    // > DateDiff.ElapsedDays: 12 
    Console.WriteLine("DateDiff.ElapsedHours: {0}", dateDiff.ElapsedHours); 
    // > DateDiff.ElapsedHours: 12 
    Console.WriteLine("DateDiff.ElapsedMinutes: {0}", dateDiff.ElapsedMinutes); 
    // > DateDiff.ElapsedMinutes: 41 
    Console.WriteLine("DateDiff.ElapsedSeconds: {0}", dateDiff.ElapsedSeconds); 
    // > DateDiff.ElapsedSeconds: 29 
} // DateDiffSample 
1

为什么这是一个问题?如果他的年龄是57天,那么57/30 == 1。如果你期望得到2,那么你应该

1)确保你的部门的结果是双倍(只需除以30.0而不是30)。原因是int/int也是int

简单的测试:
(57/30).GetType().Name == Int32
(57/30.0).GetType().Name == Double

而且(int)1.9 == 1

2)Math.Round()结果。这将是实际的数学舍入,而不是将小数点后的所有内容都丢弃。

1

只需使用TotalDays,这将给你双倍(和更“政治”正确的Days只是组件,但在你的情况是类似的),并且Math.Round()如已经@Ilia提出的“最近”。

Math.Round(ts.TotalDays); 

...或

String.Format("{0:0.##}", ts.TotalDays); 

...这应该给你喜欢1.7 months(因为我从我的头上或测试记得你赢得格式)

它更像是一个逻辑和用户界面问题,如何“呈现”给用户。

编辑:只使用到TotalDays格式化为1.7 - 或使用Math.Round得到一个圆一个月

+1

'TotalDays'是一个属性。 – 2012-04-08 14:45:33

+0

@IliaG正确如此:) - 我只是太睡着了,对这个小东西有10个编辑:) – NSGaga 2012-04-08 14:47:19

+0

@IliaG随意编辑你的答案(例如与totaldays)合并这个,让我们踢这一个 - 因为两者都是一样的,而且我对这个问题的看法并不多。 – NSGaga 2012-04-08 14:48:56

0
static public string calculateAge(DateTime birthDate, DateTime now) 
{ 
    birthDate = birthDate.Date; 
    now = now.Date; 

    var days = now.Day - birthDate.Day; 
    if (days < 0) 
    { 
    var newNow = now.AddMonths(-1); 
    days += (int)(now - newNow).TotalDays; 
    now = newNow; 
    } 
    var weeks = days/7; 
    days = days - weeks * 7; 
    var months = now.Month - birthDate.Month; 
    if (months < 0) 
    { 
    months += 12; 
    now = now.AddYears(-1); 
    } 
    var years = now.Year - birthDate.Year; 

    if (years > 0) 
    { 
    if (months > 0) 
     return string.Format("{0} Years, {1} Months", years, months); 
    else 
     return string.Format("{0} Years", years); 
    } 
    if (months > 0) 
    { 
    var builder = new StringBuilder(); 
    builder.AppendFormat("{0} Months", months); 
    if (weeks > 0) 
     builder.AppendFormat(", {0} Weeks", weeks); 
    if (days > 0) 
     builder.AppendFormat(", {0} Days", days); 
    return builder.ToString(); 
    } 
    if (weeks > 0) 
    { 
    if (days > 0) 
     return string.Format("{0} Weeks, {1} Days", weeks, days); 
    return string.Format("{0} Weeks", weeks); 
    } 

    return string.Format("{0} Days", days); 
}