2012-02-15 30 views
11

Xin lỗi mã thô, tôi đang cố gắng hiển thị thời lượng của video được tính theo thời gian tính bằng giây. Tôi đã đi bên dưới nhưng nó không hoạt động đúng cách.display timespanely

Tôi muốn nó chỉ hiển thị độc đáo - nghĩa là hiển thị 9m: 59 không phải 09m: 59 giây.

Nếu giờ là số không hiển thị giờ, nếu phút bằng 0 không hiển thị phút.

public static string GetTimeSpan(int secs) 
{ 
    TimeSpan t = TimeSpan.FromSeconds(secs); 

    string answer; 
    if (secs < 60) 
    { 
     answer = string.Format("{0:D2}s", t.Seconds); 
    } 
    else if (secs < 600)//tenmins 
    { 
     answer = string.Format("{0:m}m:{1:D2}s", t.Minutes, t.Seconds); 

    } 
    else if (secs < 3600)//hour 
    { 
     answer = string.Format("{0:mm}m:{1:D2}s", t.Minutes, t.Seconds); 
    } 
    else 
    { 
     answer = string.Format("{0:h}h:{1:D2}m:{2:D2}s", 
            t.Hours, 
            t.Minutes, 
            t.Seconds); 
    } 

    return answer; 
} 
+0

vì vậy câu hỏi của bạn là gì? hoặc bạn mong đợi điều gì sẽ xảy ra và điều gì xảy ra? xin đừng mong đợi tôi đoán :) – Alex

+0

câu hỏi là thời gian hiển thị thời gian độc đáo cho các giây. nếu giờ là số không hiển thị giờ, nếu phút là 0 không hiển thị phút, cũng sẽ muốn ở định dạng 9m: 59s không phải 09m: 59 giây cho số phút đơn. – raklos

+0

Chuỗi định dạng của bạn sai, không có thông số "m" hoặc "h". Hãy xem [MSDN] (http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx). Bạn chỉ đang đối phó với "số" chứ không phải "phút/giây"! Ngoài ra, bạn không cần phải chỉ định rõ ràng "2 địa điểm" cho các giá trị> 10. –

Trả lời

24

Cái gì như:

public static string PrintTimeSpan(int secs) 
{ 
    TimeSpan t = TimeSpan.FromSeconds(secs); 
    string answer; 
    if (t.TotalMinutes < 1.0) 
    { 
    answer = String.Format("{0}s", t.Seconds); 
    } 
    else if (t.TotalHours < 1.0) 
    { 
    answer = String.Format("{0}m:{1:D2}s", t.Minutes, t.Seconds); 
    } 
    else // more than 1 hour 
    { 
    answer = String.Format("{0}h:{1:D2}m:{2:D2}s", (int)t.TotalHours, t.Minutes, t.Seconds); 
    } 

    return answer; 
} 
+0

Tại sao nên sử dụng 't.TotalHours' khi bạn có thể sử dụng' t.Hours'? –

+4

@FandiSusanto Nếu timepan là "1 ngày và 2 giờ", TotalHours sẽ trả lại 26, Số giờ sẽ trả về 2. –

2

Theo msdn thử điều này:

if (secs < 60) 
{ 
    answer = t.Format("s"); 
} 
else if (secs < 600)//tenmins 
{ 
    answer = t.Format("m:s"); 
} 
// ... 
3

Tôi nghĩ bạn có thể đơn giản hóa điều này bằng cách loại bỏ các "D2" khía cạnh của định dạng và sau đó bạn thắng không cần một trường hợp đặc biệt cho các tùy chọn dưới mười phút. Về cơ bản, chỉ cần sử dụng

string.Format("{0}m:{1}s", t.Minutes, t.Seconds); 

sẽ nhận được một hoặc hai chữ số theo yêu cầu. Vì vậy, trường hợp cuối cùng của bạn là:

string.Format("{0}h:{1}m:{2}s", t.Hours, t.Minutes, t.Seconds); 
1
readonly static Char[] _colon_zero = { ':', '0' }; 
// ... 

var ts = new TimeSpan(DateTime.Now.Ticks); 
String s = ts.ToString("h\\:mm\\:ss\\.ffff").TrimStart(_colon_zero); 
.0321 
6.0159 
19.4833 
8:22.0010 
1:04:2394 
19:54:03.4883