استخدم string.format على فترات زمنية لإخراج ثوانٍ كاملة بدون مللي ثانية
-
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