แค่อยากรู้ว่ามีสตริงรูปแบบที่ฉันสามารถใช้เพื่อส่งออกบางอย่างเช่น "5h 3m 30s" ได้หรือไม่
เช่น. (ผิดอย่างเห็นได้ชัด)
myTimeSpan.ToString("hh mm ss")
แค่อยากรู้ว่ามีสตริงรูปแบบที่ฉันสามารถใช้เพื่อส่งออกบางอย่างเช่น "5h 3m 30s" ได้หรือไม่
เช่น. (ผิดอย่างเห็นได้ชัด)
myTimeSpan.ToString("hh mm ss")
คำตอบ:
ลอง:
myTimeSpan.ToString("h'h 'm'm 's's'")
(โปรดทราบว่าต้องมีการเว้นวรรค - นั่นคือสิ่งที่ผิดกับความพยายามครั้งแรกของฉัน)
ฉันสมมติว่าคุณใช้. NET 4 แน่นอน - ก่อนหน้านั้นTimeSpanไม่รองรับสตริงรูปแบบที่กำหนดเอง
แก้ไข: ตามที่ระบุไว้การดำเนินการนี้จะไม่ทำงานเกิน 24 ชั่วโมง โปรดทราบว่ามีทางเลือกอื่นผ่านทางNoda Timeด้วย :)
ระวังสิ่งนี้เมื่อใช้คำตอบจาก Jon Skeet พร้อมรหัสดังนี้:
// 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();
คุณจะได้ผลลัพธ์ดังนี้:
23h 24m 2s
3h 24m 2s
รูปแบบชั่วโมงสามารถแสดงได้สูงสุด 23 ชั่วโมง มันจะไม่แสดง 27 ชั่วโมงหรือแปลง 12 วันเป็นชั่วโมงมันจะตัดมันออกไปราวกับว่ามันไม่เคยมีอยู่จริง
วิธีหนึ่งในการแก้ไขปัญหานี้คือการสร้างส่วนขยายที่ตรวจสอบความยาวของ TimeSpan และสร้างการจัดรูปแบบโดยขึ้นอยู่กับว่าช่วงเวลานานกว่าหนึ่งปีวันหรือไม่ หรือคุณสามารถแสดงวันได้ตลอดเวลาเพราะไม่เคยตัดออก:
string newFormat = span.ToString("d'd 'h'h 'm'm 's's'");
โปรดทราบว่าฉันเป็นมือใหม่ในการเขียนโปรแกรม นี่เป็นเพียงการสังเกตหลังจากที่ฉันโชคดีพอที่จะสังเกตเห็นสิ่งนี้หลังจากที่คิดว่ามันจะแสดงทุกชั่วโมง ฉันพูดแบบนี้เพราะฉันไม่รู้ว่ามีวิธีแก้ปัญหาที่ดีกว่าไหมเช่นรูปแบบชั่วโมงอื่นที่สามารถแสดงชั่วโมงได้ไม่รู้จบ
อย่างไรก็ตามฉันคิดว่ารูปแบบนี้กำลังใช้งานฟังก์ชันที่ตั้งใจไว้ คุณเพียงแค่ต้องตระหนักถึงมัน ดังนั้นโพสต์นี้ คำตอบของ Jon Skeet ไม่เคยระบุว่ารูปแบบนี้จะแสดงเฉพาะคุณสมบัติชั่วโมงของรูปแบบประเภทวันที่ซึ่งชั่วโมงสามารถมีได้มากที่สุด 23
TotalHoursฯลฯ ใน TimeSpan คุณอาจต้องการสิ่งนี้Math.Floor(span.TotalHours) + span.ToString("'h 'm'm 's's'")
หากคุณโชคไม่ดีพอที่จะไม่ใช้. NET4:
string.Format("{0}h{1}m{2}s",
myTimeSpan.Hours,
myTimeSpan.Minutes,
myTimeSpan.Seconds);
TotalHoursนี้ยังคงเป็นวิธีที่จะใช้งานได้แม้ใน. net เวอร์ชันใหม่กว่า
TotalHoursเนื่องจากเป็น a doubleไม่intชอบHoursกล่าวคือจะแสดงเศษส่วนของชั่วโมงและทั้งชั่วโมง
วิธีการต่อ:
String oTime = myTimeSpan.ToString("h") + "h " +
myTimeSpan.ToString("m") + "m " +
myTimeSpan.ToString("s") + "s "
อัปเดต 1:
คุณสามารถหลีกหนีได้ด้วยเครื่องหมายคำพูดเดียว: h'h 'm'm 's's'
Hours, Minutes, Secondsคุณสมบัติ IMO ฉันอยากใช้สตริงรูปแบบที่กำหนดเองเป็นการส่วนตัวหลังจากหาคำตอบแล้ว
รหัสเล็ก ๆ นี้ช่วยในการแยกวิเคราะห์และย้อนกลับ:
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;
ใช้Xamarinและ.NET Portable 4.5นี่เป็นรูปแบบเดียวที่ฉันใช้งานได้หลังจากลองใช้คำตอบอื่น ๆ ทั้งหมดที่นี่:
timespan.ToString("hh':'mm':'ss");
โดยพื้นฐานแล้วฉันใส่:เครื่องหมายคำพูดเดี่ยวเพื่อหลีกหนีพวกเขา
บางครั้งฉันพบสตริงรูปแบบคล้าย regexes เล็กน้อยซึ่งเมื่อฉันกลับมาที่โค้ดในภายหลังฉันก็ลืมความแตกต่าง ฉันจึงดำเนินการต่อไปนี้ซึ่งมีโอกาสน้อยที่จะส่งเอกสารกลับมาให้ฉัน:
string FormatTimeSpan(TimeSpan timeSpan) =>
$"{Math.Floor(timeSpan.TotalHours)}h {timeSpan.Minutes}m {timeSpan.Seconds}s";
การแก้ไขสตริงที่แนะนำใน C # 6 ทำให้สิ่งนี้ชัดเจนกว่าที่ควรจะเป็น