TimeSpan ToString biçimi


95

Merak ediyorum, "5h 3m 30s" gibi bir çıktı vermek için kullanabileceğim bir biçim dizesi var mı?

Örneğin. (açıkça yanlış)

myTimeSpan.ToString("hh mm ss")

Yanıtlar:


144

Deneyin:

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

(Boşlukların bile alıntılanması gerektiğini unutmayın - ilk denememde yanlış olan buydu.)

Tabii ki .NET 4 kullandığınızı varsayıyorum - TimeSpanondan önce özel biçim dizelerini desteklemiyordu.

DÜZENLEME: Belirtildiği gibi, bu 24 saatten fazla çalışmayacaktır. Ayrıca alternatiflerin Noda Time aracılığıyla da mevcut olduğunu unutmayın :)


5
Dimension'ın cevabına bakın, çünkü bu 24 saat veya daha uzun süreleri doğru şekilde biçimlendirmeyecektir.
Scott

"dd'd 'hh'h' mm'm" - bu benim için çalışıyor. Biçimlendirilmiş metni "gg'gün harcandı" "ile kaydırmanız gerektiğini unutmayın. İşte dd veri barışı ve kendi metninizle 'geçirdiğiniz günler'
Pavel Shkleinik

38

Jon Skeet'in cevabını aşağıdaki gibi bir kodla kullanırken buna dikkat edin:

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

Bunun gibi sonuçlar alırsınız:

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

Saat formatı en fazla 23 saati gösterebilir. 27 saati göstermeyecek veya 12 günü saate çevirmeyecek, sanki hiç var olmamış gibi onları kesecektir.

Bunu düzeltmenin bir yolu, TimeSpan'ın uzunluğunu kontrol eden ve zaman aralığının bir yıldan, günden vb. Fazla olup olmadığına bağlı olarak biçimlendirme oluşturan bir uzantı oluşturmaktır. Ya da günleri her zaman gösterebilirsiniz çünkü asla kesilmezler:

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

Programlamada acemi olduğumu unutmayın. Bu, tüm saatleri göstereceğini varsaydıktan sonra bunu fark edecek kadar şanslı olduğumdan sonra sadece gözlemlerden geliyor. Bunu söylüyorum çünkü sonsuz saatleri gösterebilen başka bir saat formatı gibi daha iyi bir çözüm olup olmadığını bilmiyorum.

Yine de bu formatın amaçlanan işlevselliğini yaptığını düşünüyorum. Sadece bunun farkında olmalısın. Böylece bu yazı. Jon Skeet'in cevabı, bu formatın yalnızca saatlerin en fazla 23 olabileceği bir tarih türü biçiminin saat özelliğini göstermek olduğunu hiçbir zaman belirtmedi.


15
Bu yüzden TotalHoursTimeSpan'da vb var . Muhtemelen bunu istemişsinizdirMath.Floor(span.TotalHours) + span.ToString("'h 'm'm 's's'")
Aximili

17

.NET4 kullanmayacak kadar talihsizseniz:

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

9
> 24 saati desteklemesi gereken kod için, bu çözüm TotalHours.net'in daha yeni sürümlerinde bile devam etmenin yoludur.
CodesInChaos

1
Güvenebileceğiniz için bunu daha iyi buluyorum.
Chris Marisic

Kullanırken dikkat edin TotalHours, çünkü bu doublebir intbenzeri değil Hours, yani saatlerin kesirlerini ve tam saatleri gösterecektir.
Jinlye

6

uzlaşmaya ne dersin:

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

GÜNCELLEME 1:

Tek tırnakla ondan kurtulabilirsiniz: h'h 'm'm 's's'


11
Eğer birleştirme kullanmaya gidiyoruz, siz de kullanabilir Hours, Minutes, SecondsIMO özellikleri. Alıntıyı anladıktan sonra şahsen özel bir biçim dizesi kullanmayı tercih ederim.
Jon Skeet

6

Bu küçük kod, ayrıştırmak ve geri almak için yardımcı olur:

        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;

Zaman aralığı ayrıştırması için referans


5

Kullanarak Xamarinve .NET Portable 4.5buradaki diğer tüm cevapları denedikten sonra çalıştığım tek format buydu:

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

Esasen :onlardan kaçmak için tek tırnak içine koyuyorum .


2

Bazen biçim dizelerini biraz normal ifadeler gibi buluyorum, koda daha sonra geri döndüğümde nüansları unutmuşum. Bu nedenle aşağıdakileri seçtim, bu da belgeleri bana geri gönderme olasılığı düşük:

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

C # 6'da tanıtılan dize enterpolasyonu, bunu aksi takdirde olacağından çok daha net hale getiriyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.