سؤال

بالنظر إلى تمثيل تاريخ JSON التالي:

"\/Date(1221644506800-0700)\/"

كيف يمكنك إلغاء تسلسل هذا في نموذج JavaScript Date-type الخاص به؟

لقد حاولت استخدام MS AJAX JavaScrioptSerializer كما هو موضح أدناه:

Sys.Serialization.JavaScriptSerializer.deserialize("\/Date(1221644506800-0700)\/")

ومع ذلك، كل ما أعود إليه هو تاريخ السلسلة الحرفي.

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

المحلول

بشرط أن تعرف أن السلسلة هي بالتأكيد تاريخ أفضل القيام بذلك:

 new Date(parseInt(value.replace("/Date(", "").replace(")/",""), 10))

نصائح أخرى

برتراند ليروي، الذي عمل على ASP.NET Atlas/AJAX، وصف تصميم إخراج JavaScriptSerializer DateTime وكشف عن أصل الخطوط المائلة الأمامية والخلفية الغامضة.وقدم هذه التوصية:

قم بتشغيل بحث بسيط عن "/date (( d+)) /" واستبدل بـ "تاريخ جديد ($ 1)" قبل التقييم (ولكن بعد التحقق)

لقد نفذت ذلك على النحو التالي:

var serializedDateTime = "\/Date(1271389496563)\/";
document.writeln("Serialized: " + serializedDateTime + "<br />");

var toDateRe = new RegExp("^/Date\\((\\d+)\\)/$");
function toDate(s) {
    if (!s) {
        return null;
    }
    var constructor = s.replace(toDateRe, "new Date($1)");
    if (constructor == s) {
        throw 'Invalid serialized DateTime value: "' + s + '"';
    }
    return eval(constructor);
}

document.writeln("Deserialized: " + toDate(serializedDateTime) + "<br />");

هذا قريب جدًا من العديد من الإجابات الأخرى:

  • استخدم RegEx الراسخ كما فعل Sjoerd Visscher - لا تنسَ ^ و$.
  • تجنب استخدام string.replace وخيارات "g" أو "i" في RegEx الخاص بك."/Date(1271389496563)//Date(1271389496563)/" لا ينبغي أن يعمل على الإطلاق.

قيمة JSON هي سلسلة أو رقم أو كائن أو صفيف أو صحيح أو خطأ أو فارغ.لذلك هذه مجرد سلسلة.لا توجد طريقة رسمية لتمثيل التواريخ في JSON.بناء الجملة هذا مأخوذ من تطبيق asp.net ajax.ويستخدم البعض الآخر تنسيق ISO 8601.

يمكنك تحليلها على النحو التالي:

var s = "\/Date(1221644506800-0700)\/";
var m = s.match(/^\/Date\((\d+)([-+]\d\d)(\d\d)\)\/$/);
var date = null;
if (m)
  date = new Date(1*m[1] + 3600000*m[2] + 60000*m[3]);

يبحث التعبير العادي المستخدم في طريقة إلغاء تسلسل ASP.net AJAX عن سلسلة تبدو مثل "/Date(1234)/" (تحتاج السلسلة نفسها في الواقع إلى احتواء علامتي الاقتباس والشرط المائلة).للحصول على مثل هذه السلسلة، ستحتاج إلى الهروب من علامات الاقتباس وأحرف الشرطة المائلة الخلفية، وبالتالي فإن كود جافا سكريبت لإنشاء السلسلة يبدو مثل "\"\/Date(1234)\/\"".

هذا سيفي بالغرض.

Sys.Serialization.JavaScriptSerializer.deserialize("\"\\/Date(1221644506800)\\/\"")

إنه أمر غريب نوعًا ما، لكنني وجدت أنه يتعين علي إجراء تسلسل تاريخ، ثم إجراء تسلسل للسلسلة التي تم إرجاعها من ذلك، ثم إلغاء التسلسل من جانب العميل مرة واحدة.

شيء من هذا القبيل.

Script.Serialization.JavaScriptSerializer jss = new Script.Serialization.JavaScriptSerializer();
string script = string.Format("alert(Sys.Serialization.JavaScriptSerializer.deserialize({0}));", jss.Serialize(jss.Serialize(DateTime.Now)));
Page.ClientScript.RegisterStartupScript(this.GetType(), "ClientScript", script, true);

بالنسبة لأولئك الذين لا يريدون استخدام Microsoft Ajax، ما عليك سوى إضافة وظيفة النموذج الأولي إلى فئة السلسلة.

على سبيل المثال

    String.prototype.dateFromJSON = function () {
    return eval(this.replace(/\/Date\((\d+)\)\//gi, "new Date($1)"));
};

لا تريد استخدام التقييم؟جرب شيئًا بسيطًا مثل

var date = new Date(parseInt(jsonDate.substr(6)));

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

في الواقع، يدعم momentjs هذا النوع من التنسيق، يمكنك القيام بشيء مثل:

    var momentValue = moment(value);

    momentValue.toDate();

يؤدي هذا إلى إرجاع القيمة بتنسيق تاريخ جافا سكريبت

الرقم الكبير هو وقت JS القياسي

new Date(1221644506800)

الأربعاء 17 سبتمبر 2008 الساعة 19:41:46 بتوقيت جرينتش+1000 (بتوقيت شرق الولايات المتحدة)

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