2012-04-08 72 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); 
}