2009-10-14 27 views
6

Có ai có chức năng đơn giản để chuyển đổi ngày thành chuỗi đơn giản (sử dụng .Net) không?Ngày dưới dạng văn bản đơn giản (ví dụ: Hôm nay, Hôm qua, 1 Tuần trước) trong .Net

Ví dụ: 14-Oct-09 sẽ đọc "Hôm nay", 13-Oct-09 sẽ đọc "Yesterday" và 7-Oct-09 sẽ đọc "cách đây 1 tuần" vv ...

Chúc mừng, Tim

+0

Thú vị. Tôi không chắc chắn bạn sẽ nhận được bất kỳ câu trả lời nào ngoài "cuộn của riêng bạn" :) – JustLoren

+4

Một trong những câu hỏi đầu tiên trên trang web này đã giải quyết vấn đề này: http://stackoverflow.com/questions/11/how- do-i-calculate-relative-time –

+0

Và để biết cách đạt được điều này trong SQL (bạn có bao giờ muốn): http://stackoverflow.com/questions/50149/best-way-to-convert-datetime-to -n-giờ-trước-trong-sql – CraigTP

Trả lời

6

Bạn thực sự phải cuộn phương pháp của riêng bạn để làm điều này, như JustLoren nói.

Đây là phương pháp tiện ích mở rộng mà tôi đã sử dụng. Nó là GateKiller tập lệnh được tạo thành một phương pháp mở rộng. Vì vậy, tín dụng đầy đủ cho anh ta. Bạn có thể dễ dàng thay đổi nó để tuy nhiên bạn muốn nó.

public static string ToTimeSinceString(this DateTime value) 
{ 
    const int SECOND = 1; 
    const int MINUTE = 60 * SECOND; 
    const int HOUR = 60 * MINUTE; 
    const int DAY = 24 * HOUR; 
    const int MONTH = 30 * DAY; 

    TimeSpan ts = new TimeSpan(DateTime.Now.Ticks - value.Ticks); 
    double seconds = ts.TotalSeconds; 

    // Less than one minute 
    if (seconds < 1 * MINUTE) 
     return ts.Seconds == 1 ? "one second ago" : ts.Seconds + " seconds ago"; 

    if (seconds < 60 * MINUTE) 
     return ts.Minutes + " minutes ago"; 

    if (seconds < 120 * MINUTE) 
     return "an hour ago"; 

    if (seconds < 24 * HOUR) 
     return ts.Hours + " hours ago"; 

    if (seconds < 48 * HOUR) 
     return "yesterday"; 

    if (seconds < 30 * DAY) 
     return ts.Days + " days ago"; 

    if (seconds < 12 * MONTH) { 
     int months = Convert.ToInt32(Math.Floor((double)ts.Days/30)); 
     return months <= 1 ? "one month ago" : months + " months ago"; 
    } 

    int years = Convert.ToInt32(Math.Floor((double)ts.Days/365)); 
    return years <= 1 ? "one year ago" : years + " years ago"; 
} 
+0

Điều đó dường như đến thẳng từ câu trả lời được chấp nhận về câu hỏi tôi đã liên kết trong các câu hỏi bình luận; o) –

+0

Thực sự xin lỗi về điều đó. Tôi đã quên nó đến từ đâu. Đã thêm tín dụng để trả lời. – aolde

+0

Tuyệt vời, cảm ơn bạn! Đã lưu tôi một thời gian :) – TimS

6

Điều gì đó giống như phương pháp này?

public static string Stringfy(this DateTime date) 
{ 
    if ((DateTime.Now - date.Date).TotalDays == 0) 
     return "Today"; 

    if ((DateTime.Now - date.Date).TotalDays == 1) 
     return "Yesterday"; 

    // ... 

    return "A long time ago, in a galaxy far far away..."; 
} 
+3

+1 cho thiên hà cách xa rất xa – Phil

+0

Không phải TotalDays là gấp đôi? Có lẽ một Truncate là để có được toàn bộ ngày hoặc thậm chí sử dụng DateTime.Now.Date thay vì DateTime.Now – Darren

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