لا تقوم NancyFX بتسلسل التواريخ بحرف Z للإشارة إلى UTC/Zulu

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

  •  21-12-2019
  •  | 
  •  

سؤال

نقوم بتخزين جميع تواريخنا في قاعدة البيانات الخاصة بنا بالتوقيت العالمي المنسق (UTC).

وعندما يتم إرجاعها إلينا من واجهة برمجة التطبيقات (API)، تكون بالتنسيق التالي

"createdDate":"2014-07-30T18:34:45"

ولكن كما ترون، التاريخ لا يحتوي على حرف Z (مما يشير لتطبيقنا Angular إلى أن التاريخ هو UTC / Zulu).يجب أن تبدو هذه

"createdDate":"2014-07-30T18:34:45Z"

لدي الإعداد التالي في Bootstrapper الخاص بنا

JsonSettings.ISO8601DateFormat = true;

أين يمكنني في التكوين الخاص بي التأكد من وجود زائدة Z لغرض تحليل UTC؟

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

المحلول

ما هو إصدار NancyFx الذي تستخدمه؟لأنه في الإصدار 0.23.0 أو الإصدارات الأحدث، تم تغيير كود JsonSerializer لاستخدام تنسيق التاريخ "o" بدلاً من تنسيق التاريخ "s"، والذي من المفترض أن يمنحك حرف Z اللاحق الذي تبحث عنه.(ولكن فقط في أوقات UTC.)

هذا هو الالتزام الذي أحدث هذا التغيير. لاحظ كيف DateTimeKind.Unspecified يتم التعامل مع التمور على أنها محلية؛قد يكون هذا أحد الأسباب المحتملة لمشكلتك، إذا لم تقم بشكل صريح بإنشاء كائنات DateTime الخاصة بك DateTimeKind.Utc.

يوجد أدناه رمز NancyFx الذي يقوم بإجراء تسلسل لقيم DateTime، كما يبدو اعتبارًا من الإصدار 0.23.0 (بعد ذلك الالتزام).من https://github.com/NancyFx/Nancy/blob/v0.23.0/src/Nancy/Json/JsonSerializer.cs, ، الأسطر 480-518:

    void WriteValue (StringBuilder output, DateTime value)
    {
        if (this.iso8601DateFormat)
        {
            if (value.Kind == DateTimeKind.Unspecified)
            {
                // To avoid confusion, treat "Unspecified" datetimes as Local -- just like the WCF datetime format does as well.
                value = new DateTime(value.Ticks, DateTimeKind.Local);
            }
            StringBuilderExtensions.AppendCount(output, maxJsonLength, string.Concat("\"", value.ToString("o", CultureInfo.InvariantCulture), "\""));
        }
        else
        {
            DateTime time = value.ToUniversalTime();

            string suffix = "";
            if (value.Kind != DateTimeKind.Utc)
            {
                TimeSpan localTZOffset;
                if (value >= time)
                {
                    localTZOffset = value - time;
                    suffix = "+";
                }
                else
                {
                    localTZOffset = time - value;
                    suffix = "-";
                }
                suffix += localTZOffset.ToString("hhmm");
            }

            if (time < MinimumJavaScriptDate)
                time = MinimumJavaScriptDate;

            long ticks = (time.Ticks - InitialJavaScriptDateTicks)/(long)10000;
            StringBuilderExtensions.AppendCount(output, maxJsonLength, "\"\\/Date(" + ticks + suffix + ")\\/\"");
        }
    }

كما ترون، فإن طلب تنسيق التاريخ ISO 8601 سيحصل على التنسيق 2014-07-30T18:34:45 بدلاً من عدد المللي ثانية منذ العصر، ولكنه سيفترض التوقيت المحلي إذا كانت القيمة التي يتم تسلسلها لها نوع يساوي DateTimeKind.Local.

لذا لدي اقتراحان لك:قم بالترقية إلى الإصدار 0.23 من NancyFx إذا كنت لا تزال تستخدم الإصدار 0.22 أو إصدارًا أقدم (استخدم الإصدار 0.22 تنسيق التاريخ "s"، والذي لا يتضمن معلومات المنطقة الزمنية، لإجراء تسلسل لقيم التاريخ والوقت).وإذا لم يتم تعيين كائنات DateTime التي تقوم بإجراء تسلسل لها بشكل صريح DateTimeKind.Utc, ، ثم تأكد من التحديد Utc (نظرًا لأن الافتراضي هو Unspecified, ، والتي تعاملها NancyFx على أنها تعادل Local).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top