2012-04-03 11 views
36

Tôi muốn để định dạng một số lệnh thời gian thực hiện trong một định dạng có thể đọc được con người, ví dụ:Chuyển đổi mili giây để thời gian có thể đọc được con người trôi đi

3 -> 3ms 
1100 -> 1s 100ms 
62000 -> 1m 2s 
etc .. 

Có tính đến ngày tài khoản, giờ, phút, giây, ...

Có thể sử dụng C# không?

+6

Về cơ bản bạn chỉ cần sử dụng modulo và phân chia. –

+1

làm thế nào về 'TimeSpan mới (30000).ToString() '? –

+0

Vâng, tôi hỏi vì tôi có những thứ khác để làm ở đây, trong công ty của tôi, tốt hơn các bài tập lập trình cơ bản ;-) –

Trả lời

64

Bạn có thể sử dụng lớp TimeSpan, một cái gì đó như thế này:

TimeSpan t = TimeSpan.FromMilliseconds(ms); 
string answer = string.Format("{0:D2}h:{1:D2}m:{2:D2}s:{3:D3}ms", 
         t.Hours, 
         t.Minutes, 
         t.Seconds, 
         t.Milliseconds); 

Đó là khá tương tự như chủ đề này Tôi vừa tìm thấy:

What is the best way to convert seconds into (Hour:Minutes:Seconds:Milliseconds) time?

+3

Điều này sẽ tạo ra '00h: 00m: 00s: 003ms' thay vì '3ms' cho đầu vào' 3', vì vậy tôi không nghĩ đó chính là điều OP muốn;) – Nuffin

+3

@Nuffin, anh ấy luôn có thể thay đổi mã thành phù hợp với nhu cầu của mình;) Tôi vừa cung cấp một ví dụ ... – walther

2

Có thể giống như thế này?

DateTime.Now.ToString("%d 'd' %h 'h' %m 'm' %s 'seconds' %ms 'ms'") 
+0

Câu hỏi là về 'TimeSpan', không phải 'DateTime' s. Với 'DateTime', bạn sẽ luôn kết thúc với ít nhất một ngày, điều này sẽ không thực sự khớp với đầu vào của 3 mili giây. – Nuffin

15

Bạn có thể sử dụng các tĩnh Phương pháp TimeSpan.FromMilliseconds cũng như kết quả của TimeSpanDays, Hours, Minutes, SecondsMilliseconds thuộc tính.

Nhưng hiện tại tôi đang bận, vì vậy tôi sẽ để phần còn lại cho bạn làm bài tập.

8

.NET 4 chấp nhận định dạng trong TimeSpan.Tostring().

Đối với khác mà bạn có thể thực hiện phương pháp khuyến nông như

public static string Format(this TimeSpan obj) 
    { 
     StringBuilder sb = new StringBuilder(); 
     if (obj.Hours != 0) 
     { 
      sb.Append(obj.Hours); 
      sb.Append(" "); 
      sb.Append("hours"); 
      sb.Append(" "); 
     } 
     if (obj.Minutes != 0 || sb.Length != 0) 
     { 
      sb.Append(obj.Minutes); 
      sb.Append(" "); 
      sb.Append("minutes"); 
      sb.Append(" "); 
     } 
     if (obj.Seconds != 0 || sb.Length != 0) 
     { 
      sb.Append(obj.Seconds); 
      sb.Append(" "); 
      sb.Append("seconds"); 
      sb.Append(" "); 
     } 
     if (obj.Milliseconds != 0 || sb.Length != 0) 
     { 
      sb.Append(obj.Milliseconds); 
      sb.Append(" "); 
      sb.Append("Milliseconds"); 
      sb.Append(" "); 
     } 
     if (sb.Length == 0) 
     { 
      sb.Append(0); 
      sb.Append(" "); 
      sb.Append("Milliseconds"); 
     } 
     return sb.ToString(); 
    } 

và gọi như

foreach (TimeSpan span in spans) 
{ 
    MessageBox.Show(string.Format("{0}", span.Format())); 
} 
+0

Tôi đã sử dụng phương pháp này và tôi chỉ muốn lưu ý rằng khoảng thời gian cao nhất (trong trường hợp này là 'obj.Hours') nên là' obj.TotalHours, ToString ("0") '. '.TotalHours' để nó có thể hiển thị các giá trị trên 24h và', ToString ("0") 'để chuyển đổi nó thành một chữ số duy nhất thay vì giá trị được phân tách bằng dấu phẩy. –

13

gì về điều này?

var ts = TimeSpan.FromMilliseconds(86300000 /*whatever */); 
var parts = string 
       .Format("{0:D2}d:{1:D2}h:{2:D2}m:{3:D2}s:{4:D3}ms", 
        ts.Days, ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds) 
       .Split(':') 
       .SkipWhile(s => Regex.Match(s, @"00\w").Success) // skip zero-valued components 
       .ToArray(); 
var result = string.Join(" ", parts); // combine the result 

Console.WriteLine(result);   // prints '23h 58m 20s 000ms' 
0

i Vâng thường ghét viết nếu phát biểu nhưng một số lần những gì bạn thực sự phải là một móng tay và cần một cây búa.

string time; 
if (elapsedTime.TotalMinutes > 2) 
    time = string.Format("{0:n2} minutes", elapsedTime.TotalMinutes); 
else if (elapsedTime.TotalSeconds > 15) 
    time = string.Format("{0:n2} seconds", elapsedTime.TotalSeconds); 
else 
    time = string.Format("{0:n0}ms", elapsedTime.TotalMilliseconds); 
1

Ví dụ để có được 00:01:35.0090000 là 0 giờ, 1 phút, 35 giây và 9 mili giây, bạn có thể sử dụng này:

Console.WriteLine("Time elapsed:" +TimeSpan.FromMilliseconds(numberOfMilliseconds).ToString()); 

đầu ra của bạn:

Time elapsed: 00:01:35.0090000 
4
public static string ReadableTime(int milliseconds) 
{ 
    var parts = new List<string>(); 
    Action<int, string> add = (val, unit) => { if (val > 0) parts.Add(val+unit); }; 
    var t = TimeSpan.FromMilliseconds(milliseconds); 

    add(t.Days, "d"); 
    add(t.Hours, "h"); 
    add(t.Minutes, "m"); 
    add(t.Seconds, "s"); 
    add(t.Milliseconds, "ms"); 

    return string.Join(" ", parts); 
} 
+0

Đây là một cách tiếp cận tốt đẹp cho các khoảng thời gian dài hơn (mà 't.TotalDays' cũng hoạt động). –

+0

Cách tiếp cận tuyệt vời và để định dạng tùy chọn. Hành động add = (val, đơn vị, zeroplaceholder) => {if (val> 0) parts.Add (string.Format ("{0: DZ} X" .Replace ("X" , unit.ToString()) .Replace ("Z", zeroplaceholder.ToString()), val);}; và gọi với thêm (t.Milliseconds, "ms", 4); để nhận 2m 37s 0456ms – Markus