Format ToString TimeSpan

95

Hanya ingin tahu, apakah ada format string yang dapat saya gunakan untuk menghasilkan sesuatu seperti "5h 3m 30s"?

misalnya. (jelas salah)

myTimeSpan.ToString("hh mm ss")
Aximili
sumber

Jawaban:

144

Mencoba:

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

(Perhatikan bahwa bahkan spasi perlu dikutip - itulah yang salah dengan upaya pertama saya.)

Saya berasumsi Anda menggunakan .NET 4, tentu saja - sebelum itu, TimeSpantidak mendukung string format khusus.

EDIT: Seperti disebutkan, ini tidak akan bekerja lebih dari 24 jam. Perhatikan juga bahwa alternatif juga tersedia melalui Waktu Noda :)

Jon Skeet
sumber
5
Lihat jawaban Dimensi, karena yang satu ini tidak akan memformat waktu 24 jam atau lebih dengan benar.
Scott
"dd'd 'hh'h' mm'm '" - ini cocok untukku. Perhatikan bahwa Anda perlu membungkus teks yang diformat dengan apostrof: "dd'days were '". Di sini dd adalah kedamaian data dan 'hari yang dihabiskan' teks Anda sendiri '
Pavel Shkleinik
37

Waspadai ini saat menggunakan jawaban dari Jon Skeet, dengan kode seperti ini:

// 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();

Anda mendapatkan hasil seperti ini:

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

Format jam maksimal tayang 23 jam. Itu tidak akan menunjukkan 27 jam atau mengubah 12 hari menjadi jam, itu hanya akan memotongnya seolah-olah mereka tidak pernah ada.

Salah satu cara untuk memperbaikinya adalah dengan membuat ekstensi yang memeriksa panjang TimeSpan dan membuat pemformatan berdasarkan apakah rentang waktu lebih dari satu tahun, hari, dll. Atau Anda juga bisa selalu menunjukkan hari karena tidak pernah terputus:

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

Perhatikan bahwa saya seorang pemula dalam pemrograman. Ini hanya datang dari pengamatan setelah saya cukup beruntung untuk memperhatikan ini setelah berasumsi itu akan muncul sepanjang waktu. Saya mengatakan ini karena saya tidak tahu apakah ada solusi yang lebih baik, seperti format jam lain yang dapat menampilkan jam tanpa akhir.

Namun saya pikir format ini melakukan fungsi yang dimaksudkan. Anda hanya harus menyadarinya. Demikian postingan ini. Jawaban Jon Skeet tidak pernah menunjukkan bahwa format ini hanya menampilkan properti jam dari format tipe tanggal di mana jam bisa maksimal 23.

Dimensi
sumber
14
Itulah mengapa Anda memiliki TotalHoursdll di TimeSpan. Anda mungkin menginginkan iniMath.Floor(span.TotalHours) + span.ToString("'h 'm'm 's's'")
Aximili
17

Jika Anda kurang beruntung karena tidak menggunakan .NET4:

string.Format("{0}h{1}m{2}s",
    myTimeSpan.Hours,
    myTimeSpan.Minutes,
    myTimeSpan.Seconds);
Holf
sumber
9
Untuk kode yang perlu mendukung> 24 jam, solusi dengan TotalHoursini masih merupakan cara yang tepat bahkan di versi .net yang lebih baru.
CodesInChaos
1
Saya benar-benar menemukan ini lebih baik karena Anda bisa mempercayainya.
Chris Marisic
Berhati-hatilah jika menggunakan TotalHours, karena itu adalah double, bukan intsejenisnya Hours, yaitu itu akan menunjukkan pecahan jam dan juga seluruh jam.
Jinlye
6

bagaimana dengan konsentrasi:

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

UPDATE 1:

Anda dapat menghindarinya dengan kutipan tunggal: h'h 'm'm 's's'

John Woo
sumber
11
Jika Anda akan menggunakan Rangkaian, Anda mungkin juga menggunakan Hours, Minutes, Secondssifat IMO. Saya pribadi lebih suka menggunakan string format kustom, setelah mencari tahu kutipannya.
Jon Skeet
6

Kode kecil ini membantu, untuk mengurai dan membalikkan kembali:

        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;

Referensi untuk parse rentang waktu

zamoldar
sumber
5

Menggunakan Xamarindan .NET Portable 4.5ini adalah satu-satunya format yang saya kerjakan setelah mencoba semua jawaban lain di sini:

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

Pada dasarnya saya memasukkan :tanda kutip tunggal untuk menghindarinya.

Jonas Stensved
sumber
2

Kadang-kadang saya menemukan string format sedikit seperti regex, ketika saya kembali ke kode nanti, saya lupa nuansanya. Oleh karena itu, saya menggunakan yang berikut ini, yang cenderung tidak mengirim saya kembali dokumentasi:

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

Interpolasi string, yang diperkenalkan di C # 6, membuat ini jauh lebih jelas daripada yang seharusnya.

Giles
sumber