نتج عن DateTime.ToString ("MM / dd / yyyy HH: mm: ss.fff") شيء مثل "09/14/2013 07.20.31.371"

سئل على ١٨ سبتمبر ٢٠١٣  ·  تمت مشاهدة 465.1k مرة  ·  مصدر

Eldorado picture
في ١٨ سبتمبر ٢٠١٣

لدي تطبيق WP8 ، والذي سيرسل الوقت الحالي إلى خدمة ويب.

أحصل على سلسلة التاريخ والوقت بالاتصال

DateTime.ToString("MM/dd/yyyy HH:mm:ss.fff")

بالنسبة لمعظم المستخدمين ، تعمل بشكل رائع وتعطيني السلسلة الصحيحة مثل "09/10/2013 04:04:31.415" . ولكن بالنسبة لبعض المستخدمين ، فإن السلسلة الناتجة هي شيء مثل "09/14/2013 07.20.31.371" ، مما يسبب مشكلة في خدمة الويب الخاصة بي.

هل بسبب مشكلة تنسيق الثقافة؟ كيف يمكنني التأكد من أن سلسلة النتيجة محددة بنقطتين بدلاً من النقطة؟

الإجابات

Jon Skeet picture
في ١٨ سبتمبر ٢٠١٣
249

هل بسبب مشكلة تنسيق الثقافة؟

نعم. يجب أن يكون المستخدم في ثقافة يكون فيها فاصل الوقت نقطة. يتم تفسير كل من ":" و "/" بطريقة تراعي الثقافة في تنسيقات التاريخ والوقت المخصصة .

كيف يمكنني التأكد من أن سلسلة النتيجة محددة بنقطتين بدلاً من النقطة؟

أقترح تحديد CultureInfo.InvariantCulture :

string text = dateTime.ToString("MM/dd/yyyy HH:mm:ss.fff",
                                CultureInfo.InvariantCulture);

بدلا من ذلك، هل يمكن أن مجرد تعبير الوقت والتاريخ فواصل:

string text = dateTime.ToString("MM'/'dd'/'yyyy HH':'mm':'ss.fff");

... ولكن هذا سيعطيك نتائج "مثيرة للاهتمام" ربما لا تتوقعها إذا قمت بتشغيل المستخدمين في ثقافة لا يكون فيها نظام التقويم الافتراضي هو التقويم الغريغوري. على سبيل المثال ، خذ الكود التالي:

using System;
using System.Globalization;
using System.Threading;

class Test
{
    static void Main()        
    {
        DateTime now = DateTime.Now;
        CultureInfo culture = new CultureInfo("ar-SA"); // Saudi Arabia
        Thread.CurrentThread.CurrentCulture = culture;
        Console.WriteLine(now.ToString("yyyy-MM-ddTHH:mm:ss.fff"));
    }
} 

ينتج عنه (في 18 سبتمبر 2013) ما يلي:

11/12/1434 15:04:31.750

أظن أن خدمة الويب الخاصة بك ستندهش من ذلك!

أقترح في الواقع ليس فقط استخدام الثقافة الثابتة ، ولكن أيضًا التغيير إلى تنسيق تاريخ ISO-8601:

string text = dateTime.ToString("yyyy-MM-ddTHH:mm:ss.fff");

هذا تنسيق مقبول عالميًا - كما أنه قابل للفرز ، ويجعل ترتيب الشهر واليوم واضحًا. (حيث يمكن تفسير 06/07/2013 على أنه 7 يونيو أو 6 يوليو اعتمادًا على ثقافة القارئ.)

MarcinJuraszek picture
في ١٨ سبتمبر ٢٠١٣
10

: له معنى خاص: إنه فاصل الوقت. ( سلاسل تنسيق التاريخ والوقت المخصصة ).

استخدم \ للتخلص منه:

DateTime.ToString(@"MM/dd/yyyy HH\:mm\:ss.fff")

أو استخدم CultureInfo.InvariantCulture :

DateTime.ToString("MM/dd/yyyy HH:mm:ss.fff", CultureInfo.InvariantCulture)

أود أن أقترح استخدام الخيار الثاني ، لأن / له معنى خاص أيضًا (إنه فاصل التاريخ. ) ، لذلك يمكن أن تواجه مشكلات في ذلك أيضًا.

Jon La Marr picture
في ١٨ سبتمبر ٢٠١٣
8

يمكنك استخدام InvariantCulture لأن المستخدم يجب أن يكون في ثقافة تستخدم نقطة بدلاً من نقطتين:

DateTime.ToString("MM/dd/yyyy HH:mm:ss.fff", CultureInfo.InvariantCulture);
Håkon Seljåsen picture
في ٢ سبتمبر ٢٠١٥
7

لقد اصطدمت بهذه المشكلة مؤخرًا مع Windows 10 من اتجاه آخر ، ووجدت الإجابة منJonSkeet مفيدة جدًا في حل مشكلتي.

لقد أجريت أيضًا بعض الأبحاث الإضافية باستخدام نموذج اختبار ووجدت أنه عند تعيين الثقافة الحالية على "no" أو "nb-NO" في وقت التشغيل ( Thread.CurrentThread.CurrentCulture = new CultureInfo("no"); ) ، فإن ToString ("yyyy -MM-dd HH: mm: ss ") استجاب بشكل مختلف في Windows 7 و Windows 10. لقد أعاد ما كنت أتوقعه في Windows 7 و HH.mm.ss في Windows 10!

أعتقد أن هذا مخيف بعض الشيء! منذ أن كنت أؤمن أن الثقافة هي ثقافة في أي إصدار من Windows على الأقل.

Cosmin picture
في ٢٣ فبراير ٢٠١٥
4

يمكنك استخدام تنسيق String.Format:

DateTime d = DateTime.Now;
string str = String.Format("{0:00}/{1:00}/{2:0000} {3:00}:{4:00}:{5:00}.{6:000}", d.Month, d.Day, d.Year, d.Hour, d.Minute, d.Second, d.Millisecond);
// I got this result: "02/23/2015 16:42:38.234"
Hafsal picture
في ٢١ يونيو ٢٠١٧
0

تحويل التاريخ إلى سلسلة

استخدم اسم الفضاء

using System.Globalization;

الشفرة

string date = DateTime.ParseExact(datetext.Text, "dd-MM-yyyy", CultureInfo.InstalledUICulture).ToString("yyyy-MM-dd");