سؤال

تحتوي سلسلة JSON الخاصة بي على حقل تاريخ يرجع هذه القيمة:

"2009-04-04T22:55:16.0000000-04:00"

أنا مهتم بشكل خاص بتحليل مقصورة التاريخ وليس الوقت. حاولت استخدام وظيفة Reviver ، ولكن من المثير للاهتمام أن وظيفة Reviver لم يتم الاحتجاج بها أبدًا! (حاول على Firefox)

هذا هو الكود الخاص بي لإنجاز ذلك:

var Site = {
.....
dateReviver: function(key, value) {
    var a;
    if (typeof value === 'string') {
        a = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
        if (a) {
            return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
                            +a[5], +a[6]));
        }
    }
    return value;
},
loadArticle: function(id) {
....
    proxy.getArticle(id, function(response) {
        var data = JSON.parse(response.result, Site.dateReviver);
        ....
    });
}
};

json.parse في loadArticle لا تتصل أبدا dateReviver.

لقد استثمرت يومًا كاملاً ولكن لا حظ! هل يستطيع أي شخص مساعدتي رجاء؟

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

المحلول

  1. يتوقع التعبير العادي منطقة زمنية "Zulu" (حرف "Z" في النهاية) ، في حين تعرض سلسلة وقت عينة وقت زمنية رقمية ('-04: 00'). سوف يقبل Regex التالي كلاهما:

    /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)(Z|([+\-])(\d{2}):(\d{2}))$/
    

    إذا لم تكن أرقام المنطقة الزمنية صفرًا ، فقد ترغب في تعديل التاريخ بعد تحليل و/أو التحويل إلى UTC ، لاحترام المنطقة الزمنية.

  2. أستطيع أن أرى datereviver () يتم ضرب. جرب ما يلي في المتصفح:

    <!-- saved from url=(0014)about:internet -->
    <html>
        <head>
            <script src="http://www.json.org/json2.js"></script>
            <script type="text/javascript" src="http://ajax.Microsoft.com/ajax/jQuery/jquery-1.3.2.js"></script>
            <script>
                $(function () {
                    // a mock proxy to return some json to play with
                    var proxy = {
                        getArticle: function(id, foo) { foo({
                            result: '["2009-04-04T22:55:16.0000000-04:00"]'
                        }); }
                    };
                    // the origial Site object, with the fixed regex
                    var Site = {
                        dateReviver: function(key, value) {
                            var a;
                            if (typeof value === 'string') {
                                a = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)(Z|([+\-])(\d{2}):(\d{2}))$/.exec(value);
                                if (a) {
                                    return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
                                                    +a[5], +a[6]));
                                }
                            }
                            return value;
                        },
                        loadArticle: function(id) {
                            proxy.getArticle(id, function(response) {
                                var data = JSON.parse(response.result, Site.dateReviver);
                                // put the parsed JSON date on the page
                                $("#output").html(data[0].toString());
                            });
                        }
                    };
                    // try out our Site object
                    Site.loadArticle();
                });
            </script>
        </head>
        <body>
            <div id="output"></div>
        </body>
    </html>
    

    أحصل على ما يلي في المتصفح ، مما يشير إلى التحليل الناجح:

    Sat Apr 4 15:55:16 PDT 2009
    

نصائح أخرى

باستخدام TypesRipt ، فإن الحل الخاص بي على النحو التالي:

    export function parseWithDate(jsonString: string): any {
    var reDateDetect = /(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})/;  // startswith: 2015-04-29T22:06:55
    var resultObject = JSON.parse(jsonString,(key: any, value: any) => {
        if (typeof value == 'string' && (reDateDetect.exec(value))) {
            return new Date(value);
        }
        return value;
    });
    return resultObject;
}

أفضل من جميع العوالم ؛-) يستخدم datereviver مجهول ، والذي يتم استدعاؤه بواسطة json.parse على كل خاصية. يتمثل منطق Reviver في التحقق مما إذا كان الخاصية من نوع الخيط وإذا كان الأمر كذلك ، فما إذا كان يبدو بداية تاريخ ... إذا كان تاريخًا ، فدع تاريخًا جديدًا (قيمة) يقوم بالتحليل الفعلي ... يتم دعم اختلافات المنطقة الزمنية بهذه الطريقة.

أتمنى أن يساعد!

تم توسيع نطاق محولات jQuery.Ajax بشكل جيد بالنسبة لي من افتراضيها:

"text json": jQuery.parseJSON

إلى

"text json": function (xmlValue) {
            var value = JSON.parse(xmlValue, Site.dateReviver);
      return value;
      } 

استخدام return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], +a[5], +a[6]));

لا يعدل تاريخ معلومات المنطقة الزمنية ، -4:00 في المثال.

البديل هو السماح للتاريخ () القيام بالتحليل لك:

var dateReviver = function (key, value) {
    var a;
    if (typeof value === 'string') {
        a = Date.parse(value);
        if (a) {
            return new Date(a);
        }    
    }
    return value;
}

إذا تم تنسيق JSON مع json.stringify () لكان في UTC (Z).

function dateReviver (k,v) {

    var isnum = /^\d+$/.test(v);

    // Check if number since Date.parse(number) returns valid date
    if (isnum) {
        return v;
    }

    if (Date.parse(v)) {
        return new Date(Date.parse(v));
    }
    return v;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top