2010-08-23 53 views
13

Tôi muốn hiển thị thời gian đã trôi qua giữa hai ngày trong một chuỗi.Sử dụng String.Format trên một TimeSpan để xuất đầy đủ giây mà không cần mili giây

Hãy nói rằng tôi có đoạn mã sau:

DateTime date1 = DateTime.Now(); 
System.Threading.Thread.Sleep(2500); 
DateTime date2 = DateTime.Now(); 

TimeSpan elapsed = date2.substract(date1); 
Console.WriteLine("> {0:hh:mm:ss}", elapsed); 

Những gì tôi mong đợi:

> 00:00:03 

Những gì tôi nhận được:

> 00:00:02.5002500 

Có cách nào để sử dụng String. Chức năng định dạng chỉ trả về số giây đầy đủ?
Tôi cũng đã cố gắng để loại bỏ các chữ số thập phân với:

elapsed = elapsed.Substract(TimeSpan.FromMiliseconds((double)Timespan.Miliseconds); 

Nhưng điều đó không làm việc, hoặc kể từ elapsed.Miliseconds trả 500 như một Integer.

Trả lời

18

Thay đổi

Console.WriteLine("> {0:hh:mm:ss}", elapsed); 

để

Console.WriteLine("> {0:hh\\:mm\\:ss}", elapsed); 

Net 4 cho phép bạn sử dụng định dạng tùy chỉnh chuỗi với Khoảng thời gian. Bạn có thể tìm thấy tham chiếu đầy đủ về các thông số định dạng có sẵn tại trang MSDN Custom TimeSpan Format Strings.

Bạn cần phải thoát ký tự ":" bằng dấu "\" (chính nó phải được thoát trừ khi bạn đang sử dụng chuỗi nguyên văn).

Trích đoạn này từ trang MSDN Custom TimeSpan Format Strings giải thích về thoát ":" và "." các ký tự trong một chuỗi định dạng:

Bộ định dạng định dạng TimeSpan không bao gồm ký hiệu dấu tách chỗ dành sẵn, biểu tượng tách ngày, giờ, phút hoặc giây từ giây phân số. Thay vào đó, các ký hiệu này phải được bao gồm trong chuỗi định dạng tùy chỉnh dưới dạng chuỗi ký tự. Ví dụ: "dd.hh: mm" xác định dấu chấm (.) Làm dấu phân cách giữa ngày và giờ và dấu hai chấm (:) làm dấu phân tách giữa giờ và phút.

2

Sau khi xem xét một số cách để thực hiện việc này, tôi rất tiếc khi có câu trả lời xấu. Bạn không thể thực sự sử dụng Ticks, vì nó không trả về định dạng đúng, nhưng những điều sau đây sẽ hoạt động:

DateTime date1 = DateTime.Now; 
System.Threading.Thread.Sleep(2500); 
DateTime date2 = DateTime.Now; 

TimeSpan elapsed = date2.Subtract(date1); 

string[] Split = elapsed.ToString().Split('.'); 

string m = Split[0]; // Returns 00:00:02 
+0

Một giải pháp tốt đẹp, quá (Và có lẽ việc thực hiện liên quan đến hiệu quả nhất). –

+0

có thể vừa tạo ra một TimeSpan mới với các đoạn 0 giây và sau đó in một đoạn. Định dạng "g" cùng với CultureInfo.InvariantCulture sẽ hoạt động tốt –

-6

Có các định dạng tùy chỉnh sau: y (năm), M (tháng), d (ngày)), h (giờ 12), H (giờ 24), m (phút), s (giây), f (phần thứ hai), F (phần thứ hai, số 0 theo sau được cắt), t (PM hoặc AM) và z (Múi giờ).

Ví dụ sau minh họa cách các trình định dạng định dạng được viết lại cho đầu ra. [C#]

// create date time 2008-03-09 16:05:07.123  
DateTime dt = new DateTime(2008, 3, 9, 16, 5, 7, 123);  
String.Format("{0:y yy yyy yyyy}", dt); // "8 08 008 2008" year  
String.Format("{0:M MM MMM MMMM}", dt); // "3 03 Mar March" month  
String.Format("{0:d dd ddd dddd}", dt); // "9 09 Sun Sunday" day  
String.Format("{0:h hh H HH}",  dt); // "4 04 16 16"  hour 12/24 
String.Format("{0:m mm}",   dt); // "5 05"   minute 
String.Format("{0:s ss}",   dt); // "7 07"   second  
String.Format("{0:f ff fff ffff}", dt); // "1 12 123 1230" sec.fraction  
String.Format("{0:F FF FFF FFFF}", dt); // "1 12 123 123" without zeroes  
String.Format("{0:t tt}",   dt); // "P PM"   A.M. or P.M.  
String.Format("{0:z zz zzz}",  dt); // "-6 -06 -06:00" time zone 
+2

OP đang tìm cách định dạng * TimeSpan *, không phải là * DateTime *. –

13

Đáng tiếc là nó không thể định dạng một TimeSpan trong cùng một cách như một giá trị DateTime. Tuy nhiên, bạn có thể thực hiện chuyển đổi nhanh vì cả TimeSpan và DateTime lưu trữ giá trị của chúng dưới dạng các dấu tích (trong thuộc tính Ticks).

Trong code của bạn sẽ trông như thế này:

Console.WriteLine("> {0:hh:mm:ss}", new DateTime(elapsed.Ticks));

UPDATE: này áp dụng cho .NET 3.5 trở về trước, .NET 4 không hỗ trợ định dạng timespans.

+0

Tôi tin rằng bạn muốn 'HH: mm: ss' cho điều này là chính xác. Neat trick mặc dù, 1 từ tôi – fearofawhackplanet

+0

Giải pháp tuyệt vời (vì thời gian của tôi sẽ không bao giờ lớn hơn 24h) và fearofawhackplanet là đúng: 'HH: mm: ss' có ý nghĩa hơn. –

+2

Trong .Net 4 bạn thực sự có thể định dạng một Timespan theo cùng một cách như một DateTime. Bạn có thể sử dụng các mục sau: {0: hh \\: mm \\: ss}. Xem câu trả lời của tôi dưới đây để biết thêm chi tiết. –

1

Hmm, đây là khó chịu (khi nó quay ra) - ít nhất là trước khi NET 4.0

Nếu bạn đi ở đây: http://msdn.microsoft.com/en-us/library/1ecy8h51(v=VS.90).aspx nó sẽ cho bạn biết rằng không có tình trạng quá tải định dạng cho một khoảng thời gian và rằng bạn có để làm điều đó bằng tay ví dụ:

 span.Hours.ToString("00") + ":" + 
    span.Minutes.ToString("00") + ":" + 
    span.Seconds.ToString("00") + "." 

này xuất hiện - ít nhất là từ các tài liệu hướng dẫn - được cố định trong .NET 4.0

4

lớp TimeSpanHours, MinutesSeconds thuộc tính trả về từng phần riêng lẻ. Vì vậy, bạn có thể thử:

String.Format(CultureInfo.CurrentCulture, "{0}:{1}:{2}", 
    elapsed.Hours, 
    elapsed.Minutes, 
    elapsed.Seconds) 

Để nhận định dạng bạn muốn.

Có thể có cách tối ưu hơn nhưng tôi chưa tìm thấy.

-2

bạn có thể làm điều này:

dt.Subtract(TimeSpan.FromMilliseconds(dt.Millisecond)).ToString(); 
+2

Vui lòng thêm một số giải thích! –

+0

Điều này cũng làm việc, nhưng kể từ khi Framework 4 .NET nativly hỗ trợ định dạng timespan là giải pháp tốt nhất. –

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