2011-08-27 50 views
0

如果日期与几个月前或几年相似,则以下方法会返回null。如果我想将日期显示为“2个月前”或“1年前”。我应该如何修改以下方法?需要帮助修改方法以非正式方式显示日期

// 1. 
     // Get time span elapsed since the date. 
     TimeSpan s = DateTime.Now.Subtract(d); 

     // 2. 
     // Get total number of days elapsed. 
     int dayDiff = (int)s.TotalDays; 

     // 3. 
     // Get total number of seconds elapsed. 
     int secDiff = (int)s.TotalSeconds; 

     // 4. 
     // Don't allow out of range values. 
     if (dayDiff < 0 || dayDiff >= 31) 

     { 
      return null; 
     } 

     // 5. 
     // Handle same-day times. 
     if (dayDiff == 0) 
     { 
      // A. 
      // Less than one minute ago. 
      if (secDiff < 60) 
      { 
       return "just now"; 
      } 
      // B. 
      // Less than 2 minutes ago. 
      if (secDiff < 120) 
      { 
       return "1 minute ago"; 
      } 
      // C. 
      // Less than one hour ago. 
      if (secDiff < 3600) 
      { 
       return string.Format("{0} minutes ago", 
        Math.Floor((double)secDiff/60)); 
      } 
      // D. 
      // Less than 2 hours ago. 
      if (secDiff < 7200) 
      { 
       return "1 hour ago"; 
      } 
      // E. 
      // Less than one day ago. 
      if (secDiff < 86400) 
      { 
       return string.Format("{0} hours ago", 
        Math.Floor((double)secDiff/3600)); 
      } 
     } 
     // 6. 
     // Handle previous days. 
     if (dayDiff == 1) 
     { 
      return "yesterday"; 
     } 
     if (dayDiff < 7) 
     { 
      return string.Format("{0} days ago", 
      dayDiff); 
     } 
     if (dayDiff < 31) 
     { 
      return string.Format("{0} weeks ago", 
      Math.Ceiling((double)dayDiff/7)); 
     } 
     return null; 
    } 

回答

1

if块之后:if (dayDiff < 31) { ... }插入以下代码:

if (dayDiff < 365) 
{ 
    return string.Format("{0} month(s) ago", Math.Ceiling((double)dayDiff/31)); 
} 
else 
{ 
    return string.Format("{0} year(s) ago", Math.Ceiling((double)dayDiff/365)); 
} 
+0

非常感谢! :d – Infinity

1

您可以直接比较喜欢的时间跨度:

TimeSpan s = DateTime.Now.Subtract(d); 
if (s < TimeSpan.FromDays(1)) 
{ 
// ... 
} 
else if (s < TimeSpan.FromMonth(1)) 
{ 
// ... 
} 
// ... 

只是结合这正是你想要的方式(抱歉,但我真的不能从你的问题解析) 我想你可能会喜欢:

TimeSpan s = DateTime.Now.Subtract(d); 
if (s < TimeSpan.FromDays(1)) 
{ 
return string.Format("{0:0} hour(s) ago", s.TotalHours); 
} 
else if (s < TimeSpan.FromDays(7)) 
{ 
return string.Format("{0:0} day(s) ago", s.TotalDays); 
} 
// ...