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:
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 :)
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.
TotalHoursTimeSpan'da vb var . Muhtemelen bunu istemişsinizdirMath.Floor(span.TotalHours) + span.ToString("'h 'm'm 's's'")
.NET4 kullanmayacak kadar talihsizseniz:
string.Format("{0}h{1}m{2}s",
myTimeSpan.Hours,
myTimeSpan.Minutes,
myTimeSpan.Seconds);
TotalHours.net'in daha yeni sürümlerinde bile devam etmenin yoludur.
TotalHours, çünkü bu doublebir intbenzeri değil Hours, yani saatlerin kesirlerini ve tam saatleri gösterecektir.
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'
Hours, Minutes, SecondsIMO özellikleri. Alıntıyı anladıktan sonra şahsen özel bir biçim dizesi kullanmayı tercih ederim.
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;
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 .
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.