รูปแบบ TimeSpan ToString


97

แค่อยากรู้ว่ามีสตริงรูปแบบที่ฉันสามารถใช้เพื่อส่งออกบางอย่างเช่น "5h 3m 30s" ได้หรือไม่

เช่น. (ผิดอย่างเห็นได้ชัด)

myTimeSpan.ToString("hh mm ss")

คำตอบ:


146

ลอง:

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

(โปรดทราบว่าต้องมีการเว้นวรรค - นั่นคือสิ่งที่ผิดกับความพยายามครั้งแรกของฉัน)

ฉันสมมติว่าคุณใช้. NET 4 แน่นอน - ก่อนหน้านั้นTimeSpanไม่รองรับสตริงรูปแบบที่กำหนดเอง

แก้ไข: ตามที่ระบุไว้การดำเนินการนี้จะไม่ทำงานเกิน 24 ชั่วโมง โปรดทราบว่ามีทางเลือกอื่นผ่านทางNoda Timeด้วย :)


5
ดูคำตอบของมิติข้อมูลเนื่องจากข้อนี้จะจัดรูปแบบเวลา 24 ชั่วโมงหรือนานกว่านั้นไม่ถูกต้อง
Scott

"dd'd 'hh'h' mm'm '" - นี่ใช้ได้กับฉัน พิจารณาว่าคุณต้องห่อข้อความที่จัดรูปแบบด้วยเครื่องหมายอะพอสทรอฟี: "dd'days spend '" ที่นี่ dd คือความสงบของข้อมูลและ 'วันที่ใช้ไป' ข้อความของคุณเอง
Pavel Shkleinik

38

ระวังสิ่งนี้เมื่อใช้คำตอบจาก 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


15
นั่นเป็นเหตุผลที่คุณมีTotalHoursฯลฯ ใน TimeSpan คุณอาจต้องการสิ่งนี้Math.Floor(span.TotalHours) + span.ToString("'h 'm'm 's's'")
Aximili

17

หากคุณโชคไม่ดีพอที่จะไม่ใช้. NET4:

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

10
สำหรับโค้ดที่ต้องรองรับ> 24 ชม. โซลูชันTotalHoursนี้ยังคงเป็นวิธีที่จะใช้งานได้แม้ใน. net เวอร์ชันใหม่กว่า
CodesInChaos

1
ฉันพบว่าสิ่งนี้ดีขึ้นจริงๆเพราะคุณสามารถไว้วางใจได้
Chris Marisic

ระวังหากใช้TotalHoursเนื่องจากเป็น a doubleไม่intชอบHoursกล่าวคือจะแสดงเศษส่วนของชั่วโมงและทั้งชั่วโมง
Jinlye

6

วิธีการต่อ:

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

อัปเดต 1:

คุณสามารถหลีกหนีได้ด้วยเครื่องหมายคำพูดเดียว: h'h 'm'm 's's'


12
หากคุณกำลังจะใช้ concatenation คุณเช่นกันอาจจะใช้Hours, Minutes, Secondsคุณสมบัติ IMO ฉันอยากใช้สตริงรูปแบบที่กำหนดเองเป็นการส่วนตัวหลังจากหาคำตอบแล้ว
Jon Skeet

6

รหัสเล็ก ๆ นี้ช่วยในการแยกวิเคราะห์และย้อนกลับ:

        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;

การอ้างอิงสำหรับการแยกวิเคราะห์ช่วงเวลา


5

ใช้Xamarinและ.NET Portable 4.5นี่เป็นรูปแบบเดียวที่ฉันใช้งานได้หลังจากลองใช้คำตอบอื่น ๆ ทั้งหมดที่นี่:

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

โดยพื้นฐานแล้วฉันใส่:เครื่องหมายคำพูดเดี่ยวเพื่อหลีกหนีพวกเขา


3

บางครั้งฉันพบสตริงรูปแบบคล้าย regexes เล็กน้อยซึ่งเมื่อฉันกลับมาที่โค้ดในภายหลังฉันก็ลืมความแตกต่าง ฉันจึงดำเนินการต่อไปนี้ซึ่งมีโอกาสน้อยที่จะส่งเอกสารกลับมาให้ฉัน:

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

การแก้ไขสตริงที่แนะนำใน C # 6 ทำให้สิ่งนี้ชัดเจนกว่าที่ควรจะเป็น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.