استخدم string.format على فترات زمنية لإخراج ثوانٍ كاملة بدون مللي ثانية

StackOverflow https://stackoverflow.com/questions/3545508

  •  30-09-2019
  •  | 
  •  

سؤال

أريد أن أعرض الوقت المنقضي بين تاريخين في سلسلة.

لنفترض أن لدي الرمز التالي:

DateTime date1 = DateTime.Now();
System.Threading.Thread.Sleep(2500);
DateTime date2 = DateTime.Now();

TimeSpan elapsed = date2.substract(date1);
Console.WriteLine("> {0:hh:mm:ss}", elapsed);

ما أتوقعه:

> 00:00:03

ماذا حصلت:

> 00:00:02.5002500

هل هناك طريقة لاستخدام وظيفة string.format لإرجاع ثوانٍ كاملة فقط؟
حاولت أيضًا إزالة الأماكن العشرية بـ:

elapsed = elapsed.Substract(TimeSpan.FromMiliseconds((double)Timespan.Miliseconds);

لكن هذا لا يعمل أيضًا منذ انقضاء. miliseconds يعيد 500 كصاحب صحيح.

هل كانت مفيدة؟

المحلول

غير ال

Console.WriteLine("> {0:hh:mm:ss}", elapsed);

إلى

Console.WriteLine("> {0:hh\\:mm\\:ss}", elapsed);

.NET 4 يتيح لك استخدام سلاسل تنسيق مخصصة مع زمنية. يمكنك العثور على مرجع كامل لمحاعد التنسيق المتاحة في MSDN سلاسل تنسيق زمنية مخصصة صفحة.

تحتاج إلى الهروب من الحرف ":" مع "" (والتي يجب أن تفلت من نفسه إلا إذا كنت تستخدم سلسلة حرفية).

هذا المقتطف من MSDN سلاسل تنسيق زمنية مخصصة يشرح الصفحة حول الهروب من ":" و "." الأحرف في سلسلة التنسيق:

لا تتضمن مواصفات تنسيق الزمن المخصص رموز فاصلة من العناصر النائبة ، مثل الرموز التي تنفصل عن أيام من ساعات أو ساعات من دقائق أو ثوانٍ من ثواني كسرية. بدلاً من ذلك ، يجب تضمين هذه الرموز في سلسلة التنسيق المخصصة مثل الأسلاك الحرفية. على سبيل المثال ، يعرّف "dd.hh: mm" فترة (.) على أنها فاصل بين الأيام والساعات ، والقولون (:) كفاصل بين الساعات والدقائق.

نصائح أخرى

لسوء الحظ ، لا يمكن تنسيق أ TimeSpan بنفس الطريقة مثل أ DateTime القيمة. ومع ذلك ، يمكنك إجراء تحويل سريع لأن كلا من Timepan و DateTime يخزنون قيمتها كقاعدة (في Ticks منشأه).

في الكود الخاص بك الذي سيبدو هكذا:

Console.WriteLine("> {0:hh:mm:ss}", new DateTime(elapsed.Ticks));

تحديث: هذا ينطبق على .NET 3.5 وما قبل ، .NET 4 لا يدعم الزمنات التنسيق.

ال TimeSpan الفصل لديه Hours, Minutes و Seconds الخصائص التي تعود في كل مرة الجزء بشكل فردي. لذلك يمكنك المحاولة:

String.Format(CultureInfo.CurrentCulture, "{0}:{1}:{2}", 
    elapsed.Hours, 
    elapsed.Minutes, 
    elapsed.Seconds)

للحصول على التنسيق الذي تريده.

قد تكون هناك طريقة أكثر مثالية ، لكنني لم أجدها بعد.

بعد النظر في طرق قليلة للقيام بذلك ، للأسف تركت إجابة قبيحة. لا يمكنك استخدام القراد حقًا ، لأنه لا يعيد التنسيق بشكل صحيح ، لكن ما يلي سيعمل:

DateTime date1 = DateTime.Now;
System.Threading.Thread.Sleep(2500);
DateTime date2 = DateTime.Now;

TimeSpan elapsed = date2.Subtract(date1);

string[] Split = elapsed.ToString().Split('.');

string m = Split[0]; // Returns 00:00:02

حسنًا ، هذا أمر سيء (كما اتضح) - على الأقل قبل .NET 4.0

إذا ذهبت هنا: http://msdn.microsoft.com/en-us/library/1ecy8h51(v=vs.90).aspx سوف يخبرك أنه لا يوجد تنسيق زائد لـ TimeSpan وأن عليك القيام بذلك باليد على سبيل المثال:

     span.Hours.ToString("00") + ":" + 
     span.Minutes.ToString("00") + ":" + 
     span.Seconds.ToString("00") + "."

يظهر هذا - على الأقل من الوثائق - ليتم إصلاحه في .NET 4.0

يمكنك القيام بالأمر:

dt.Subtract(TimeSpan.FromMilliseconds(dt.Millisecond)).ToString();

هناك مواصفات تنسيق مخصصة y (السنة) ، M (الشهر) ، D (اليوم) ، H (الساعة 12) ، H (الساعة 24) ، M (دقيقة) ، S (الثانية) ، F (الكسر الثاني) ، و (الكسر الثاني ، يتم قطع الأصفار الزمنية) ، T (PM أو AM) و Z (المنطقة الزمنية).

توضح الأمثلة التالية كيف يتم إعادة كتابة مواصفات التنسيق إلى الإخراج. [C#

// create date time 2008-03-09 16:05:07.123    
DateTime dt = new DateTime(2008, 3, 9, 16, 5, 7, 123);    
String.Format("{0:y yy yyy yyyy}", dt);  // "8 08 008 2008"   year    
String.Format("{0:M MM MMM MMMM}", dt);  // "3 03 Mar March"  month    
String.Format("{0:d dd ddd dddd}", dt);  // "9 09 Sun Sunday" day    
String.Format("{0:h hh H HH}",     dt);  // "4 04 16 16"      hour 12/24
String.Format("{0:m mm}",          dt);  // "5 05"            minute
String.Format("{0:s ss}",          dt);  // "7 07"            second    
String.Format("{0:f ff fff ffff}", dt);  // "1 12 123 1230"   sec.fraction    
String.Format("{0:F FF FFF FFFF}", dt);  // "1 12 123 123"    without zeroes    
String.Format("{0:t tt}",          dt);  // "P PM"            A.M. or P.M.    
String.Format("{0:z zz zzz}",      dt);  // "-6 -06 -06:00"   time zone
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top