2010-08-01 38 views
7

tôi có mã này để dành thời gian trong quá khứ và tạo chuỗi có thể đọc được để thể hiện khoảng thời gian trước đó.có cách thông minh hơn để tạo "thời gian từ" với đối tượng DateTime

  1. Tôi đã nghĩ rằng Timespan.Hours sẽ cung cấp cho bạn giờ ngay cả khi ngày một nhiều trong quá khứ nhưng có vẻ như nó chia nhỏ thành các thành phần riêng biệt của nó (ngày, tháng, v.v ...). Làm thế nào tôi sẽ nhận được tổng số giờ trước (thậm chí nếu nó hơn 1 ngày?

  2. Có cách nào sạch để viết loại mã dưới đây vì nó có vẻ khá spagetti-ish.

Đây là mã

 DateTime when = GetDateTimeinPast(); 
     TimeSpan ts = DateTime.Now.Subtract(when); 

     switch (ts.Days) 
     { 
      case 0: 
       if (ts.Hours < 1) 
        b.Append(ts.Minutes + " minutes ago"); 
       else 
        b.Append(ts.Hours + " hours ago"); 
       break; 
      case 1: 
       b.Append(" yesterday"); 
       break; 
      case 2: 
      case 3:     
      case 4: 

       b.Append("on " + when.DayOfWeek.ToString()); 
       break; 
      default: 
       b.Append(ts.Days + " days ago"); 
       break; 
     } 
+0

Ngôn ngữ có thể giúp – TheLQ

+0

Xuất hiện thành C#. –

+0

@ Lord.Quackstar - cập nhật các thẻ và câu hỏi – leora

Trả lời

13

Sử dụng TotalHours tài sản hoặc Total[TimeUnit] các tài sản khác trong đối tượng TimeSpan.

Đối với một khoảng thời gian 1:10 (hh: mm), nó tương đương với 1 Hours và 10 Minutes hoặc 1.167 TotalHours và 70 TotalMinutes.

Để dọn dẹp, hãy sử dụng các nhánh nếu bạn đã có trước đó. chuyển đổi/trường hợp sẽ không giúp bạn với những điều kiện này, chỉ cho các giá trị cụ thể. Một cái gì đó như thế này:

DateTime when = GetDateTimeinPast(); 
TimeSpan ts = DateTime.Now.Subtract(when); 
if (ts.TotalHours < 1) 
    b.AppendFormat("{0} minutes ago", (int)ts.TotalMinutes); 
else if (ts.TotalDays < 1) 
    b.AppendFormat("{0} hours ago", (int)ts.TotalHours); 
//etc... 
+0

M - cảm ơn.Bất kỳ ý tưởng nào về câu hỏi thứ hai hoặc là ở trên về cơ bản là giải pháp – leora

1

Thay vào đó, tôi có một giải pháp vượt quá ngày với tuần, tháng và năm. Cách tiếp cận này có một chút khác biệt Nó tiến bộ từ quá khứ đến tương lai, trước tiên hãy thử các bước lớn và nếu nó vượt qua chuyển sang bước tiếp theo nhỏ hơn.

PeriodOfTimeOutput.cs

0

Tôi biết đây là một bài cũ, nhưng tôi đã đưa ra giải pháp này sử dụng đệ quy sau khi tìm kiếm cho chủ đề này và đọc Jeff Mercado của câu trả lời

private string PeriodOfTimeOutput(TimeSpan tspan, int level = 0) 
{ 
    string how_long_ago = "ago"; 
    if (level >= 2) return how_long_ago; 
    if (tspan.Days > 1) 
     how_long_ago = string.Format("{0} Days ago", tspan.Days); 
    else if (tspan.Days == 1) 
     how_long_ago = string.Format("1 Day {0}", PeriodOfTimeOutput(new TimeSpan(tspan.Hours, tspan.Minutes, tspan.Seconds), level + 1)); 
    else if (tspan.Hours >= 1) 
     how_long_ago = string.Format("{0} {1} {2}", tspan.Hours, (tspan.Hours > 1) ? "Hours" : "Hour", PeriodOfTimeOutput(new TimeSpan(0, tspan.Minutes, tspan.Seconds), level + 1)); 
    else if (tspan.Minutes >= 1) 
     how_long_ago = string.Format("{0} {1} {2}", tspan.Minutes, (tspan.Minutes > 1) ? "Minutes" : "Minute", PeriodOfTimeOutput(new TimeSpan(0, 0, tspan.Seconds), level + 1)); 
    else if (tspan.Seconds >= 1) 
     how_long_ago = string.Format("{0} {1} ago", tspan.Seconds, (tspan.Seconds > 1) ? "Seconds" : "Second");   
    return how_long_ago; 
} 

sử dụng như vậy

var tspan = DateTime.Now.Subtract(reqDate); 
string how_long_ago = PeriodOfTimeOutput(tspan); 
1

Câu trả lời rất muộn, nhưng tôi cảm thấy cần thiết cho điều này và tìm kiếm các thuật ngữ JS phổ biến như "C# momentjs datetime" hoặc "C# timeago" cho thấy kết quả hoàn toàn không hữu ích - tôi không muốn duy trì thêm mã với các số ma thuật được mã hóa cứng và sẽ không được bản địa hóa thân thiện. Vì vậy, cuối cùng, trong một trong những ý kiến ​​trong một câu trả lời SO, tôi thấy thư viện:

Humanizer cho .NET - https://github.com/Humanizr/Humanizer#humanize-datetime

Cách sử dụng:

DateTime.UtcNow.AddHours(-2).Humanize() => "2 hours ago" 

Và đó là bản địa hóa quá!

+0

Hoàn toàn là câu trả lời đúng. –

Các vấn đề liên quan