jquery بحث - كيف يمكنني تنسيق تاريخ Microsoft JSON؟




يوجد الاصلية (25)

لا تفكر في هذا. مثلما فعلنا منذ عقود ، نجحنا في إزاحة رقمية من العصر القياسي الواقعي في 1 يناير 1970 منتصف الليل بتوقيت جرينتش / UTC / & c في عدد الثواني (أو ميلي ثانية) منذ هذه الحقبة. جافا سكريبت يحبها ، جافا يحبها ، C يحبها ، ويحبها الإنترنت.

أنا أخذ صدعتي الأولى في Ajax مع jQuery. أتلقى بياناتي على صفحتي ، ولكن أواجه بعض المشكلات في بيانات JSON التي تم إرجاعها لأنواع بيانات التاريخ. في الأساس ، أحصل على سلسلة ظهر تبدو كالتالي:

/Date(1224043200000)/

من شخص جديد كليًا إلى JSON - كيف أقوم بتنسيق ذلك بتنسيق تاريخ قصير؟ هل يجب التعامل مع هذا في مكان ما في رمز jQuery؟ لقد حاولت استخدام المكون الإضافي jQuery.UI.datepicker باستخدام $.datepicker.formatDate() بدون أي نجاح.

لمعلوماتك: إليك الحل الذي توصلت إليه باستخدام مزيج من الإجابات هنا:

function getMismatch(id) {
  $.getJSON("Main.aspx?Callback=GetMismatch",
    { MismatchId: id },

    function (result) {
      $("#AuthMerchId").text(result.AuthorizationMerchantId);
      $("#SttlMerchId").text(result.SettlementMerchantId);
      $("#CreateDate").text(formatJSONDate(Date(result.AppendDts)));
      $("#ExpireDate").text(formatJSONDate(Date(result.ExpiresDts)));
      $("#LastUpdate").text(formatJSONDate(Date(result.LastUpdateDts)));
      $("#LastUpdatedBy").text(result.LastUpdateNt);
      $("#ProcessIn").text(result.ProcessIn);
    }
  );

  return false;
}

function formatJSONDate(jsonDate) {
  var newDate = dateFormat(jsonDate, "mm/dd/yyyy");
  return newDate;
}

حصل هذا الحل على الكائن من طريقة رد الاتصال وعرض التواريخ على الصفحة بشكل صحيح باستخدام مكتبة تنسيق التاريخ.


باستخدام jQuery UI datepicker - من المنطقي حقًا فقط إذا كنت بالفعل متضمنة jQuery UI:

$.datepicker.formatDate('MM d, yy', new Date(parseInt('/Date(1224043200000)/'.substr(6)))); 

انتاج:

15 أكتوبر 2008


واضطررت أيضاً إلى البحث عن حل لهذه المشكلة ، وفي نهاية المطاف ، صادفت moment.js وهي مكتبة جميلة يمكنها تحليل تنسيق التاريخ وغير ذلك الكثير.

var d = moment(yourdatestring)

أنقذت بعض الصداع بالنسبة لي لذا ظننت أنني سأشاركها معك. :)
يمكنك العثور على مزيد من المعلومات حول هذا الموضوع هنا: http://momentjs.com/


إذا كنت تقول في JavaScript ،

var thedate = new Date(1224043200000);
alert(thedate);

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


لا تكرر نفسك - قم بتحويل التاريخ تلقائيًا باستخدام $.parseJSON()

توفر الإجابات على رسالتك تحويل التاريخ يدويًا إلى تواريخ جافا سكريبت. لقد قمت بتمديد jQuery's $.parseJSON() فقط قليلاً ، حتى تتمكن من تحليل التواريخ تلقائيًا عندما تقوم $.parseJSON() . يقوم بمعالجة تواريخ ASP.NET المنسقة ( /Date(12348721342)/ ) بالإضافة إلى تواريخ ISO المنسقة ( 2010-01-01T12.34.56.789Z ) التي تدعمها وظائف JSON الأصلية في المستعرضات (والمكتبات مثل json2.js).

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


يمكنك أيضًا استخدام مكتبة جافا سكريبت http://momentjs.com/ ، والتي تأتي في متناول اليد عندما تخطط للتعامل مع تنسيقات مترجمة مختلفة وإجراء عمليات أخرى مع قيم التواريخ:

function getMismatch(id) {
    $.getJSON("Main.aspx?Callback=GetMismatch",
    { MismatchId: id },

    function (result) {
        $("#AuthMerchId").text(result.AuthorizationMerchantId);
        $("#SttlMerchId").text(result.SettlementMerchantId);
        $("#CreateDate").text(moment(result.AppendDts).format("L"));
        $("#ExpireDate").text(moment(result.ExpiresDts).format("L"));
        $("#LastUpdate").text(moment(result.LastUpdateDts).format("L"));
        $("#LastUpdatedBy").text(result.LastUpdateNt);
        $("#ProcessIn").text(result.ProcessIn);
    }
    );
    return false;
}

يعد إعداد الترجمة أمرًا سهلاً مثل إضافة ملفات التهيئة (تحصل عليها في اللحظة) إلى مشروعك وتهيئة اللغة:

moment.lang('de');

يمكنك استخدام هذا للحصول على تاريخ من JSON:

var date = eval(jsonDate.replace(/\/Date\((\d+)\)\//gi, "new Date($1)"));

وبعد ذلك يمكنك استخدام برنامج نصي لتكوين تنسيق جافا سكريبت (1.2 كيلوبايت عند التقليل و gzipped) لعرضه كما تريد.


var newDate = dateFormat(jsonDate, "mm/dd/yyyy"); 

هل هناك خيار آخر بدون استخدام مكتبة jQuery؟


ماذا لو .NET ...

return DateTime.Now.ToString("u"); //"2013-09-17 15:18:53Z"

ثم في JavaScript ...

var x = new Date("2013-09-17 15:18:53Z");

أحصل على التاريخ مثل هذا:

"/Date(1276290000000+0300)/"

في بعض الأمثلة يكون التاريخ بتنسيقات مختلفة قليلاً:

"/Date(12762900000000300)/"
"Date(1276290000000-0300)"

إلخ

لذلك توصلت مع RegExp التالية:

/\/+Date\(([\d+]+)\)\/+/

والرمز النهائي هو:

var myDate = new Date(parseInt(jsonWcfDate.replace(/\/+Date\(([\d+-]+)\)\/+/, '$1')));

آمل أن يساعد.

تحديث: لقد عثرت على هذا الرابط من Microsoft: كيف أقوم بتسلسل التواريخ مع JSON؟

هذا يبدو وكأنه واحد ونحن جميعا نبحث عنه.


أضف المساعد jQuery UI في صفحتك:

function DateFormate(dateConvert) {
    return $.datepicker.formatDate("dd/MM/yyyy", eval('new ' + dateConvert.slice(1, -1)));
};

لمعلوماتك ، لأي شخص يستخدم Python على جانب الخادم: datetime.datetime (). ctime () بإرجاع سلسلة يتم توزيعها من قبل "new Date ()". بمعنى ، إذا قمت بإنشاء مثيل datetime.datetime جديد (مثل datetime.datetime.now) ، يمكن تضمين السلسلة في سلسلة JSON ، ومن ثم يمكن تمرير هذه السلسلة كوسيطة أولى إلى مُنشئ التاريخ. لم أجد حتى الآن أي استثناءات ، لكني لم أختبرها بدقة.


var obj = eval('(' + "{Date: \/Date(1278903921551)\/}".replace(/\/Date\((\d+)\)\//gi, "new Date($1)") + ')');
var dateValue = obj["Date"];

كل واحد من هذه الإجابات لديه شيء واحد مشترك: كلهم ​​يقومون بتخزين التواريخ كقيمة واحدة (عادة ما تكون سلسلة).

خيار آخر هو الاستفادة من البنية الأصلية لـ JSON ، وتمثيل التاريخ كقائمة أرقام:

{ "name":"Nick",
  "birthdate":[1968,6,9] }

بالطبع ، سيتعين عليك التأكد من أن طرفي المحادثة متفقان على الشكل (السنة ، الشهر ، اليوم) ، وأي الحقول يقصد بها أن تكون تواريخ ، ... لكن لها ميزة تجنب قضية التاريخ تمامًا. لتحويل إلى سلسلة. كل الأرقام - بدون قيود على الإطلاق. أيضا ، باستخدام الترتيب: السنة والشهر واليوم يسمح أيضا الفرز الصحيح حسب التاريخ.

مجرد التفكير خارج المربع هنا - لا يجب تخزين تاريخ JSON كسلسلة.

مكافأة أخرى للقيام بذلك بهذه الطريقة هي أنه يمكنك بسهولة (وكفاءة) تحديد كافة السجلات لمدة سنة أو شهر معين من خلال الاستفادة من طريقة معالجة CouchDB الاستعلامات على قيم الصفيف.


محدث

لدينا مكتبة داخلية لـ UI يجب أن تتوافق مع تنسيق JSON المدمج في ASP.NET الخاص بـ Microsoft ، مثل /Date(msecs)/ ، سألنا عن الأصل في الأصل ، ومعظم تنسيق JSON بما في ذلك JSON.NET ، مثل 2014-06-22T00:00:00.0 . بالإضافة إلى ذلك نحن بحاجة للتعامل مع عدم القدرة على التعامل مع أي شيء سوى 3 منازل عشرية .

نكتشف أولاً أي نوع من التواريخ التي نستهلكها ، ونحللها إلى كائن Date جافا سكريبت عادي ، ثم نساعدك على ذلك.

1) كشف تنسيق تاريخ مايكروسوفت

// Handling of Microsoft AJAX Dates, formatted like '/Date(01238329348239)/'
function looksLikeMSDate(s) {
    return /^\/Date\(/.test(s);
}

2) كشف تنسيق تاريخ ISO

var isoDateRegex = /^(\d\d\d\d)-(\d\d)-(\d\d)T(\d\d):(\d\d):(\d\d)(\.\d\d?\d?)?([\+-]\d\d:\d\d|Z)?$/;

function looksLikeIsoDate(s) {
    return isoDateRegex.test(s);
}

3) تنسيق تاريخ تحليل MS:

function parseMSDate(s) {
    // Jump forward past the /Date(, parseInt handles the rest
    return new Date(parseInt(s.substr(6)));
}

4) تحليل تنسيق التاريخ ISO.

لدينا على الأقل طريقة للتأكد من أننا نتعامل مع تواريخ ISO القياسية أو تعديل مواعيد ISO بحيث يكون لدينا دائمًا ثلاثة أجزاء من الألف من الثانية ( انظر أعلاه ) ، لذلك تختلف الشفرة وفقًا للبيئة.

4 أ) تحليل صيغة ISO القياسية للتاريخ ، والتعامل مع مشكلات oldIE:

function parseIsoDate(s) {
    var m = isoDateRegex.exec(s);

    // Is this UTC, offset, or undefined? Treat undefined as UTC.
    if (m.length == 7 ||                // Just the y-m-dTh:m:s, no ms, no tz offset - assume UTC
        (m.length > 7 && (
            !m[7] ||                    // Array came back length 9 with undefined for 7 and 8
            m[7].charAt(0) != '.' ||    // ms portion, no tz offset, or no ms portion, Z
            !m[8] ||                    // ms portion, no tz offset
            m[8] == 'Z'))) {            // ms portion and Z
        // JavaScript's weirdo date handling expects just the months to be 0-based, as in 0-11, not 1-12 - the rest are as you expect in dates.
        var d = new Date(Date.UTC(m[1], m[2]-1, m[3], m[4], m[5], m[6]));
    } else {
        // local
        var d = new Date(m[1], m[2]-1, m[3], m[4], m[5], m[6]);
    }

    return d;
}

4b) تحليل تنسيق ISO مع أماكن عشرية عشرية ثابتة - أسهل بكثير:

function parseIsoDate(s) {
    return new Date(s);
}

5) قم بتنسيقه:

function hasTime(d) {
    return !!(d.getUTCHours() || d.getUTCMinutes() || d.getUTCSeconds());
}

function zeroFill(n) {
    if ((n + '').length == 1)
        return '0' + n;

    return n;
}

function formatDate(d) {
    if (hasTime(d)) {
        var s = (d.getMonth() + 1) + '/' + d.getDate() + '/' + d.getFullYear();
        s += ' ' + d.getHours() + ':' + zeroFill(d.getMinutes()) + ':' + zeroFill(d.getSeconds());
    } else {
        var s = (d.getMonth() + 1) + '/' + d.getDate() + '/' + d.getFullYear();
    }

    return s;
}

6) اربطها معًا:

function parseDate(s) {
    var d;
    if (looksLikeMSDate(s))
        d = parseMSDate(s);
    else if (looksLikeIsoDate(s))
        d = parseIsoDate(s);
    else
        return null;

    return formatDate(d);
}

تُعد الإجابة القديمة أدناه مفيدة لربط تنسيق التاريخ هذا بتحليل JSON الخاص بـ jQuery بحيث تحصل على كائنات التاريخ بدلاً من السلاسل ، أو إذا كنت لا تزال عالقة في jQuery <1.5 بطريقة أو بأخرى.

الاجابه القديمة

إذا كنت تستخدم وظيفة Ajax 1.4 jQuery مع ASP.NET MVC ، فيمكنك تشغيل جميع خصائص DateTime في كائنات التاريخ باستخدام:

// Once
jQuery.parseJSON = function(d) {return eval('(' + d + ')');};

$.ajax({
    ...
    dataFilter: function(d) {
        return d.replace(/"\\\/(Date\(-?\d+\))\\\/"/g, 'new $1');
    },
    ...
});

في jQuery 1.5 يمكنك تجنب تجاوز طريقة parseJSON عالمياً باستخدام خيار المحولات في استدعاء Ajax.

http://api.jquery.com/jQuery.ajax/

لسوء الحظ ، عليك التبديل إلى مسار eval القديم حتى تتمكن من تحليل التواريخ على مستوى العالم - وإلا فأنت تحتاج إلى تحويلها على أساس ما بعد كل حالة على حدة.


هذا يمكن أن يساعدك أيضًا.

 function ToJavaScriptDate(value) { //To Parse Date from the Returned Parsed Date
        var pattern = /Date\(([^)]+)\)/;
        var results = pattern.exec(value);
        var dt = new Date(parseFloat(results[1]));
        return (dt.getMonth() + 1) + "/" + dt.getDate() + "/" + dt.getFullYear();
    }

هذا امر محبط. كان الحل الخاص بي هو تحليل "/ و /" من القيمة التي تم إنشاؤها بواسطة JavaScriptSerializer لـ ASP.NET بحيث ، على الرغم من أن JSON قد لا تحتوي على تاريخ حرفي ، إلا أنه لا يزال يتم تفسيره بواسطة المتصفح كتاريخ ، أريد: {"myDate":Date(123456789)}

مخصص JavaScriptConverter لـ DateTime؟

يجب أن أؤكد على دقة تعليق روي تينكر. هذه ليست JSON القانونية. إنه اختصار قذر وسخيط على الخادم لإزالة المشكلة قبل أن تصبح مشكلة لجافا سكريبت. وسوف خنق محلل JSON. اعتدت عليه للنهوض من الأرض ، لكنني لا تستخدم هذا أكثر من ذلك. ومع ذلك ، ما زلت أشعر أن أفضل إجابة تكمن في تغيير كيفية تنسيق الخادم للتاريخ ، على سبيل المثال ، ISO كما هو مذكور في مكان آخر.


انقر هنا للتحقق من العرض التوضيحي

جافا سكريبت / مسج

var = MyDate_String_Value = "/Date(1224043200000)/"
var value = new Date
            (
                 parseInt(MyDate_String_Value.replace(/(^.*\()|([+-].*$)/g, ''))
            );
var dat = value.getMonth() +
                         1 +
                       "/" +
           value.getDate() +
                       "/" +
       value.getFullYear();

النتيجة - "10/15/2008"


انتهى بي الأمر بإضافة "الأحرف إلى تعبير Panos العادي للتخلص من تلك التي تم إنشاؤها بواسطة مسلسل Microsoft عند كتابة الكائنات في نص برمجي داخلي:

لذا إذا كان لديك خاصية في C # code-behind فهذا شيء مثل

protected string JsonObject { get { return jsSerialiser.Serialize(_myObject); }}

وفي ASX لديك

<script type="text/javascript">
    var myObject = '<%= JsonObject %>';
</script>

ستحصل على شيء من هذا القبيل

var myObject = '{"StartDate":"\/Date(1255131630400)\/"}';

لاحظ علامات الاقتباس المزدوجة.

للحصول على هذا النموذج الذي سيتم إلغاء عملية eval بشكل صحيح ، استخدمت:

myObject = myObject.replace(/"\/Date\((\d+)\)\/"/g, 'new Date($1)');

يمكنني استخدام Prototype واستخدامه أضفت

String.prototype.evalJSONWithDates = function() {
    var jsonWithDates = this.replace(/"\/Date\((\d+)\)\/"/g, 'new Date($1)');
    return jsonWithDates.evalJSON(true);
}

في ما يلي حل بسيط جدًا لتحليل تواريخ JSON. استخدم الوظائف التالية حسب متطلباتك. تحتاج فقط إلى تمرير تنسيق JSON تم جلب التاريخ كمعلمة للوظائف أدناه:

function JSONDate(dateStr) {
    var m, day;
    jsonDate = dateStr;
    var d = new Date(parseInt(jsonDate.substr(6)));
    m = d.getMonth() + 1;
    if (m < 10)
        m = '0' + m
    if (d.getDate() < 10)
        day = '0' + d.getDate()
    else
        day = d.getDate();
    return (m + '/' + day + '/' + d.getFullYear())
}

function JSONDateWithTime(dateStr) {
    jsonDate = dateStr;
    var d = new Date(parseInt(jsonDate.substr(6)));
    var m, day;
    m = d.getMonth() + 1;
    if (m < 10)
        m = '0' + m
    if (d.getDate() < 10)
        day = '0' + d.getDate()
    else
        day = d.getDate();
    var formattedDate = m + "/" + day + "/" + d.getFullYear();
    var hours = (d.getHours() < 10) ? "0" + d.getHours() : d.getHours();
    var minutes = (d.getMinutes() < 10) ? "0" + d.getMinutes() : d.getMinutes();
    var formattedTime = hours + ":" + minutes + ":" + d.getSeconds();
    formattedDate = formattedDate + " " + formattedTime;
    return formattedDate;
}

لا يوجد نوع تاريخ مضمّن في JSON . هذا يبدو مثل عدد الثواني / ميلي ثانية من بعض الحقبة. إذا كنت تعرف الحقبة ، يمكنك إنشاء التاريخ من خلال إضافة الوقت المناسب.


Eval ليست ضرورية. هذا سوف يعمل بشكل جيد:

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

تقوم الدالة substr بإخراج "/ Date (" جزء ، وتحصل الدالة parseInt على العدد الصحيح وتتجاهل ") /" في النهاية. يتم تمرير الرقم الناتج في منشئ التاريخ.

تحرير: لقد تركت عن قصد خارج الجذر (الوسيطة الثانية ل parseInt) ؛ انظر تعليقي أدناه . أيضًا ، أتفق تمامًا مع تعليق Rory : يُفضل استخدام المواعيد ISO-8601 على هذا التنسيق القديم - لذلك لا ينبغي استخدام هذا التنسيق بشكل عام للتطوير الجديد. شاهد مكتبة Json.NET الممتازة للحصول على بديل رائع يقوم بتسلسل التواريخ باستخدام تنسيق ISO-8601.

بالنسبة إلى ISO-8601 تواريخ JSON المهيأة ، ما عليك سوى تمرير السلسلة إلى مُنشئ التاريخ:

var date = new Date(jsonDate); //no ugly parsing needed; full timezone support

تحقق من تاريخ ISO القياسية ؛ نوع من هذا القبيل:

yyyy.MM.ddThh:mm

يصبح 2008.11.20T22:18 .


حل Mootools:

new Date(Date(result.AppendDts)).format('%x')

يتطلب mootools أكثر. تم اختباره باستخدام mootools-1.2.3.1-more على Firefox 3.6.3 و IE 7.0.5730.13


هل يمكن أن يكون لديك تعليق في JSONP ، ولكن ليس في JSON النقي. لقد قضيت للتو ساعة في محاولة لجعل برنامجي يعمل مع هذا المثال من Highcharts: http://www.highcharts.com/samples/data/jsonp.php?filename=aapl-c.json&callback=?

إذا قمت باتباع الارتباط ، سترى

?(/* AAPL historical OHLC data from the Google Finance API */
[
/* May 2006 */
[1147651200000,67.79],
[1147737600000,64.98],
...
[1368057600000,456.77],
[1368144000000,452.97]
]);

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

في النهاية ، لقد أرسلت طلب HTTP يدويًا إلى العنوان أعلاه وأدركت أن نوع المحتوى كان text/javascriptمنذ ذلك الحين ، حسنًا ، ترجع JSONP جافا سكريبت الخالصة. في هذه الحالة ، يُسمح بالتعليقات . لكن طلبي عاد من نوع المحتوى application/json، لذلك اضطررت إلى إزالة التعليقات.





jquery asp.net ajax json