Định dạng TimeSpan ToString


95

Chỉ tò mò, có một chuỗi định dạng mà tôi có thể sử dụng để xuất ra một cái gì đó như "5h 3 phút 30s" không?

ví dụ. (rõ ràng là sai)

myTimeSpan.ToString("hh mm ss")

Câu trả lời:


143

Thử:

myTimeSpan.ToString("h'h 'm'm 's's'")

(Lưu ý rằng ngay cả dấu cách cũng cần được trích dẫn - đó là điều sai với lần thử đầu tiên của tôi.)

Tôi giả sử bạn đang sử dụng .NET 4, tất nhiên - trước đó, TimeSpankhông hỗ trợ chuỗi định dạng tùy chỉnh.

CHỈNH SỬA: Như đã lưu ý, điều này sẽ không hoạt động sau 24 giờ. Cũng lưu ý rằng các lựa chọn thay thế cũng có sẵn qua Noda Time :)


5
Xem câu trả lời của Thứ nguyên, vì thứ nguyên này sẽ không định dạng chính xác thời gian là 24 giờ hoặc lâu hơn.
— Scott

"dd'd 'hh'h' mm'm '" - điều này phù hợp với tôi. Hãy lưu ý rằng bạn cần bao bọc văn bản được định dạng bằng dấu nháy đơn: "dd'days đã chi '". Dưới đây là dd yên dữ liệu và 'ngày dành' text của riêng bạn'
— Pavel Shkleinik

37

Hãy lưu ý điều này khi sử dụng câu trả lời từ Jon Skeet, với mã như sau:

// 12 days, 23 hours, 24 minutes, 2 seconds.
TimeSpan span = new TimeSpan(12, 23, 24, 2);
// 27 hours, 24 minutes, 2 seconds
TimeSpan span2 = new TimeSpan(27,24,2);

string format = span.ToString("h'h 'm'm 's's'");
string format2 = span2.ToString("h'h 'm'm 's's'");
Console.WriteLine(format);
Console.WriteLine(format2);
Console.ReadLine();

Bạn nhận được kết quả như sau:

23h 24m 2s
3h 24m 2s

Định dạng giờ có thể hiển thị tối đa 23 giờ. Nó sẽ không hiển thị 27 giờ hoặc chuyển đổi 12 ngày thành giờ, nó sẽ đơn giản là cắt chúng đi như thể chúng chưa từng tồn tại.

Một cách để khắc phục điều này là tạo tiện ích mở rộng kiểm tra độ dài của TimeSpan và tạo định dạng dựa trên nếu khoảng thời gian là hơn một năm, ngày, v.v. Hoặc bạn có thể đơn giản luôn hiển thị ngày vì chúng không bao giờ bị cắt:

string newFormat = span.ToString("d'd 'h'h 'm'm 's's'");

Xin lưu ý rằng tôi là người mới bắt đầu lập trình. Điều này chỉ đến từ những lần quan sát sau khi tôi may mắn nhận thấy điều này sau khi đã cho rằng nó sẽ hiển thị cả giờ. Tôi đang nói điều này vì tôi không biết có giải pháp nào tốt hơn, chẳng hạn như một định dạng giờ khác có thể hiển thị giờ vô tận.

Tuy nhiên, tôi nghĩ rằng định dạng này đang thực hiện chức năng dự kiến ​​của nó. Bạn chỉ cần nhận thức về nó. Vì vậy, bài đăng này. Câu trả lời của Jon Skeet chưa bao giờ chỉ ra rằng định dạng này chỉ hiển thị thuộc tính giờ của định dạng loại ngày trong đó giờ có thể là nhiều nhất là 23.


14
Đó là lý do tại sao bạn có TotalHoursvv trong TimeSpan. Có thể bạn muốn điều nàyMath.Floor(span.TotalHours) + span.ToString("'h 'm'm 's's'")
— Aximili

17

Nếu bạn không may mắn không sử dụng .NET4:

string.Format("{0}h{1}m{2}s",
    myTimeSpan.Hours,
    myTimeSpan.Minutes,
    myTimeSpan.Seconds);

9
Đối với mã cần hỗ trợ> 24h, giải pháp TotalHoursnày vẫn là cách tốt nhất để áp dụng ngay cả trong các phiên bản .net mới hơn.
— CodesInChaos

1
Tôi thực sự thấy điều này tốt hơn vì bạn có thể tin tưởng nó.
— Chris Marisic

Hãy cẩn thận nếu sử dụng TotalHours, vì đó là một double, không phải là inttương tự Hours, tức là nó sẽ hiển thị các phân số của giờ cũng như cả giờ.
— Jinlye

6

làm thế nào về sự giam cầm:

String oTime = myTimeSpan.ToString("h") + "h " +
               myTimeSpan.ToString("m") + "m " +
               myTimeSpan.ToString("s") + "s "

CẬP NHẬT 1:

Bạn có thể thoát khỏi nó với một câu trích dẫn duy nhất: h'h 'm'm 's's'


11
Nếu bạn đang đi để sử dụng nối, bạn cũng có thể sử dụng Hours, Minutes, Secondstính IMO. Cá nhân tôi muốn sử dụng một chuỗi định dạng tùy chỉnh, sau khi tìm ra trích dẫn.
— Jon Skeet

6

Đoạn mã nhỏ này giúp phân tích cú pháp và ngược lại:

        var t = TimeSpan.FromMilliseconds(450780);

        double d1 = t.TotalSeconds;


        string t3 = t.ToString(@"hh\:mm\:ss\.f",null);


        var tt = TimeSpan.ParseExact(t3, @"hh\:mm\:ss\.f",null);
        double d2 = tt.TotalSeconds;

Tham chiếu cho phân tích khoảng thời gian


5

Sử dụng Xamarinvà .NET Portable 4.5đây là định dạng duy nhất tôi đã làm việc sau khi thử tất cả các câu trả lời khác ở đây:

timespan.ToString("hh':'mm':'ss");

Về cơ bản, tôi đang đặt các :dấu ngoặc kép để thoát khỏi chúng.


2

Đôi khi tôi thấy các chuỗi định dạng hơi giống regexes, trong đó khi tôi quay lại mã sau đó, tôi đã quên mất các sắc thái. Do đó, tôi đã làm theo những điều sau, điều này ít có khả năng gửi lại cho tôi tài liệu:

string FormatTimeSpan(TimeSpan timeSpan) =>
    $"{Math.Floor(timeSpan.TotalHours)}h {timeSpan.Minutes}m {timeSpan.Seconds}s";

Nội suy chuỗi, được giới thiệu trong C # 6, đang làm cho điều này rõ ràng hơn rất nhiều so với cách khác.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.