it-swarm.asia

كيف يمكنني تنسيق تاريخ Microsoft JSON؟

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

/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;
}

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

1903
Mark Struzinski

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

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

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

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

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

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

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

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

وبعد ذلك يمكنك استخدام تنسيق تاريخ JavaScript script (1.2 كيلو بايت عند تصغيرها وضغطها) لعرضها كما تريد.

124
Panos

بالنسبة لأولئك الذين يستخدمون Newtonsoft Json.NET ، اقرأ عن كيفية القيام بذلك من خلال Native JSON في IE8 و Firefox 3.5 plus Json.NET .

كما أن الوثائق المتعلقة بتغيير تنسيق التواريخ المكتوبة بواسطة Json.NET مفيدة: تسلسل التواريخ مع Json.NET

لأولئك الذين هم كسول جدا ، وهنا هي خطوات سريعة. نظرًا لأن JSON لديه تطبيق DateTime فضفاض ، فأنت بحاجة إلى استخدام IsoDateTimeConverter(). لاحظ أنه منذ Json.NET 4.5 ، يكون تنسيق التاريخ الافتراضي هو ISO ، وبالتالي فإن الرمز أدناه غير مطلوب.

string jsonText = JsonConvert.SerializeObject(p, new IsoDateTimeConverter());

سوف JSON تأتي من خلال

"fieldName": "2009-04-12T20:44:55"

أخيرًا ، بعض JavaScript لتحويل تاريخ ISO إلى تاريخ JavaScript:

function isoDateReviver(value) {
  if (typeof value === 'string') {
    var a = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)(?:([\+-])(\d{2})\:(\d{2}))?Z?$/.exec(value);
      if (a) {
        var utcMilliseconds = Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], +a[5], +a[6]);
        return new Date(utcMilliseconds);
      }
  }
  return value;
}

اعتدت عليه مثل هذا

$("<span />").text(isoDateReviver(item.fieldName).toLocaleString()).appendTo("#" + divName);
93
Jason Jong

المثال الأصلي:

/Date(1224043200000)/  

لا يعكس التنسيق الذي يستخدمه WCF عند إرسال التواريخ عبر WCF REST باستخدام تسلسل JSON المدمج. (على الأقل على .NET 3.5 ، SP1)

لقد وجدت أن الإجابة مفيدة هنا ، ولكن يلزم إجراء تعديل طفيف على regex ، حيث يبدو أنه يتم إلحاق إزاحة GMT بتوقيت جرينتش بالرقم الذي تم إرجاعه (منذ 1970) في WCF JSON.

في خدمة WCF لدي:

[OperationContract]
[WebInvoke(
    RequestFormat = WebMessageFormat.Json,
    ResponseFormat = WebMessageFormat.Json,
    BodyStyle = WebMessageBodyStyle.WrappedRequest
    )]
ApptVisitLinkInfo GetCurrentLinkInfo( int appointmentsId );

يتم تعريف ApptVisitLinkInfo ببساطة:

public class ApptVisitLinkInfo {
    string Field1 { get; set; }
    DateTime Field2 { get; set; }
    ...
}

عند إرجاع "Field2" كـ Json من الخدمة ، تكون القيمة:

/Date(1224043200000-0600)/

لاحظ إزاحة المنطقة الزمنية المضمنة كجزء من القيمة.

Regex المعدلة:

/\/Date\((.*?)\)\//gi

إنه أكثر شغفًا بقليل ويمسك كل شيء بين الآباء ، وليس فقط الرقم الأول. الوقت الناتج sinze 1970 ، بالإضافة إلى إزاحة المنطقة الزمنية يمكن تغذية جميعها في eval للحصول على كائن تاريخ.

السطر الناتج من JavaScript للاستبدال هو:

replace(/\/Date\((.*?)\)\//gi, "new Date($1)");
63
Aaron

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

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

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

60
Robert Koritnik

إذا قلت في JavaScript ،

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

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

59
John Boker

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

JavaScript/jQuery

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"

55
user2007801

محدث

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

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

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

// 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;
}

4 ب) تحليل تنسيق 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 حتى تحصل على كائنات Date بدلاً من الجمل ، أو إذا كنت لا تزال عالقًا في jQuery <1.5 بطريقة أو بأخرى.

الجواب القديم

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

// 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 الأقدم من أجل الحصول على التواريخ لتحليلها في مكانها على المستوى العالمي - وإلا فإنك تحتاج إلى تحويلها على أساس كل حالة على حدة.

36
Chris Moschini

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

var d = moment(yourdatestring)

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

24
Venemo

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

23
johnstok

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

لذلك إذا كان لديك خاصية في C # الكود وراء هذا شيء من هذا القبيل

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

وفي aspx لديك

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

ستحصل على شيء مثل

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

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

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

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

يمكنني استخدام النموذج الأولي واستخدامه أضفت

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

في jQuery 1.5 ، طالما لديك json2.js لتغطية المستعرضات القديمة ، يمكنك إلغاء تسلسل جميع التواريخ الواردة من Ajax كما يلي:

(function () {
    var DATE_START = "/Date(";
    var DATE_START_LENGTH = DATE_START.length;

    function isDateString(x) {
        return typeof x === "string" && x.startsWith(DATE_START);
    }

    function deserializeDateString(dateString) {
        var dateOffsetByLocalTime = new Date(parseInt(dateString.substr(DATE_START_LENGTH)));
        var utcDate = new Date(dateOffsetByLocalTime.getTime() - dateOffsetByLocalTime.getTimezoneOffset() * 60 * 1000);
        return utcDate;
    }

    function convertJSONDates(key, value) {
      if (isDateString(value)) {
        return deserializeDateString(value);
      }
      return value;
    }

    window.jQuery.ajaxSetup({
      converters: {
        "text json": function(data) {
          return window.JSON.parse(data, convertJSONDates);
        }
      }
    });
}());

لقد أدرجت منطقًا يفترض أن ترسل جميع التواريخ من الخادم باسم UTC (والتي يجب عليك) ؛ يحصل المستهلك بعد ذلك على كائن JavaScript Date الذي يحتوي على قيمة علامات التجزئة المناسبة لعكس هذا. أي أن استدعاء getUTCHours() ، وما إلى ذلك في التاريخ ، سيعود بنفس القيمة التي كانت عليه على الخادم ، وسيقوم استدعاء getHours() بإرجاع القيمة في المنطقة الزمنية المحلية للمستخدم على النحو الذي يحدده متصفحهم.

هذا لا يأخذ في الاعتبار WCF format مع إزاحة المناطق الزمنية ، على الرغم من أن ذلك سيكون من السهل نسبياً إضافته.

21
Domenic

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

19
Jé Queue

باستخدام منتقي التاريخ jQuery UI - من المنطقي حقًا فقط إذا كنت تشمل بالفعل واجهة مستخدم jQuery:

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

انتاج:

15 أكتوبر 2008

19
dominic

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

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

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

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

مجرد التفكير خارج الصندوق هنا - ليس من الضروري تخزين تاريخ JSON كسلسلة.

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

18
Nick Perkins

نشر في موضوع ممتاز:

var d = new Date(parseInt('/Date(1224043200000)/'.slice(6, -2)));
alert('' + (1 + d.getMonth()) + '/' + d.getDate() + '/' + d.getFullYear().toString().slice(-2));
16
Dan Beam
var newDate = dateFormat(jsonDate, "mm/dd/yyyy"); 

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

16
Bilgin Kılıç

فقط لإضافة نهج آخر هنا ، فإن "نهج التجزئة" الذي يتبعه WCF هو عرضة لمشاكل المناطق الزمنية إذا لم تكن شديد الحذر مثل الموصوف هنا وفي أماكن أخرى. لذلك أنا أستخدم الآن تنسيق ISO 8601 الذي يدعمه كل من .NET و JavaScript حسب الأصول والذي يتضمن إزاحات زمنية. أدناه هي التفاصيل:

في WCF/.NET:

حيث يكون CreationDate عبارة عن System.DateTime ؛ ToString ("o") يستخدم محدد تنسيق Round-trip الخاص بـ .NET الذي ينشئ سلسلة تاريخ متوافقة مع ISO 8601

new MyInfo {
    CreationDate = r.CreationDate.ToString("o"),
};

في JavaScript

فقط بعد استرداد JSON ، أذهب إلى إصلاح التواريخ لتكون كائنات JavaSript Date باستخدام مُنشئ التاريخ الذي يقبل سلسلة تاريخ ISO 8601 ...

$.getJSON(
    "MyRestService.svc/myinfo",
    function (data) {
        $.each(data.myinfos, function (r) {
            this.CreatedOn = new Date(this.CreationDate);
        });
        // Now each myinfo object in the myinfos collection has a CreatedOn field that is a real JavaScript date (with timezone intact).
       alert(data.myinfos[0].CreationDate.toLocaleString());
    }
)

بمجرد حصولك على تاريخ JavaScript ، يمكنك استخدام جميع طرق التاريخ المريحة والموثوقة مثل toDateString ، toLocaleString ، إلخ.

15
Scott Willeke

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

"/Date(1276290000000+0300)/"

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

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

إلخ.

لذلك توصلت إلى RegExp التالية:

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

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

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

آمل أن يساعد.

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

هذا يبدو مثل الذي نبحث عنه جميعًا.

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

يوجد أدناه حل بسيط جدًا لتحليل تواريخ 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;
}
9
Umar Malik

يمكنك أيضًا استخدام مكتبة JavaScript moment.js ، والتي تكون مفيدة عندما تخطط للتعامل مع تنسيقات مترجمة مختلفة وتنفيذ عمليات أخرى مع قيم التواريخ:

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;
}

يعد إعداد الترجمة سهلاً مثل إضافة ملفات التكوين (يمكنك الحصول عليها من momentjs.com) إلى مشروعك وتكوين اللغة:

moment.lang('de');
8
martinoss

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

مخصص JavaScriptConverter ل DateTime؟

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

8
StarTrekRedneck

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

yyyy.MM.ddThh:mm

يصبح 2008.11.20T22:18.

8
Thomas Hansen

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

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

وظيفة متأخرة ، ولكن بالنسبة لأولئك الذين بحثوا عن هذا المنصب.

تخيل هذا:

    [Authorize(Roles = "Administrator")]
    [Authorize(Roles = "Director")]
    [Authorize(Roles = "Human Resources")]
    [HttpGet]
    public ActionResult GetUserData(string UserIdGuidKey)
    {
        if (UserIdGuidKey!= null)
        {
            var guidUserId = new Guid(UserIdGuidKey);
            var memuser = Membership.GetUser(guidUserId);
            var profileuser = Profile.GetUserProfile(memuser.UserName);
            var list = new {
                              UserName = memuser.UserName,
                              Email = memuser.Email ,
                              IsApproved = memuser.IsApproved.ToString() ,
                              IsLockedOut = memuser.IsLockedOut.ToString() ,
                              LastLockoutDate = memuser.LastLockoutDate.ToString() ,
                              CreationDate = memuser.CreationDate.ToString() ,
                              LastLoginDate = memuser.LastLoginDate.ToString() ,
                              LastActivityDate = memuser.LastActivityDate.ToString() ,
                              LastPasswordChangedDate = memuser.LastPasswordChangedDate.ToString() ,
                              IsOnline = memuser.IsOnline.ToString() ,
                              FirstName = profileuser.FirstName ,
                              LastName = profileuser.LastName ,
                              NickName = profileuser.NickName ,
                              BirthDate = profileuser.BirthDate.ToString() ,
            };
            return Json(list, JsonRequestBehavior.AllowGet);
        }
        return Redirect("Index");
    }

كما ترون ، أنا أستغل ميزة C # 3.0 لإنشاء الوراثة "Auto". إنه كسول بعض الشيء ، لكني أحببته ويعمل. مجرد ملاحظة: الملف الشخصي عبارة عن فئة مخصصة قمت بإنشائها لمشروع تطبيق الويب الخاص بي.

7
Ray Linder

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

 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();
    }
7
Ravi Mehta

حل Mootools:

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

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

7
Midhat

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

6
Kyle Alan Hale

ماذا لو .NET إرجاع ...

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

ثم في JavaScript ...

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

في الكود التالي. لدي

1. استرجاع الطابع الزمني من سلسلة التاريخ.

2. وتحليلها إلى Int

3. وأخيراً أنشئ Date باستخدامه.

var dateString = "/Date(1224043200000)/";
var seconds = parseInt(dateString.replace(/\/Date\(([0-9]+)[^+]\//i, "$1"));
var date = new Date(seconds);
console.log(date);
5
Harun Diluka Heshan

كملاحظة جانبية ، يدعم KendoUI تحويل تاريخ Microsoft JSON. لذلك ، إذا كان مشروعك يحتوي على إشارة إلى "KendoUI" ، يمكنك ببساطة استخدام

var newDate = kendo.parseDate(jsonDate);
2
Safeer Hussain

يستخدم هذا تعبيرًا منتظمًا ، ويعمل أيضًا:

var date = new Date(parseInt(/^\/Date\((.*?)\)\/$/.exec(jsonDate)[1], 10));
2
Vlad Bezden

أبسط طريقة يمكن أن أقترحها هي استخدام regex على JS مثل:

//Only use [0] if you are sure that the string matches the pattern
//Otherwise, verify if 'match' returns something
"/Date(1512488018202)/".match(/\d+/)[0] 
2
Reuel Ribeiro

مثال regex آخر يمكنك تجربته باستخدام:

var mydate = json.date
var date = new Date(parseInt(mydate.replace(/\/Date\((-?\d+)\)\//, '$1');
mydate = date.getMonth() + 1 + '/' + date.getDate() + '/' + date.getFullYear();

date.getMonth() تقوم بإرجاع عدد صحيح من 0 - 11 لذلك يجب علينا إضافة 1 للحصول على رقم الشهر الصحيح

2
Luminous

جرب هذا...

function formatJSONDate(jsonDate) {
            var date = jsonDate;
            var parsedDate = new Date(parseInt(date.toString().substring(6)));
            var newDate = new Date(parsedDate);
            var getMonth = newDate.getMonth() + 1;
            var getDay = newDate.getDay();
            var getYear = newDate.getFullYear(); 

            var standardDate = (getMonth<10 ? '0' : '') + getMonth + '/' + (getDay<10 ? '0' : '') + getDay + '/' + getYear;
            return standardDate;
        }

إرجاع getYear () السنة - 1900 ، لقد تم إهمال هذا لفترة من الوقت الآن ، من الأفضل استخدام getFullYear ()

2
Noor All Safaet

يمكنني استخدام هذه الوظيفة البسيطة للحصول على التاريخ من Microsoft JSON Date

function getDateValue(dateVal) {
    return new Date(parseInt(dateVal.replace(/\D+/g, '')));
};

replace(/\D+/g, '') ستزيل كل الحروف بخلاف الأرقام

parseInt سيحول السلسلة إلى رقم

استعمال

$scope.ReturnDate = getDateValue(result.JSONDateVariable)
1
Vignesh Subramanian

من السهل تحويل تاريخ JSON إلى تاريخ JavaScript:

var s = Response.StartDate;     
s = s.replace('/Date(', '');

s = s.replace(')/', '');

var expDate = new Date(parseInt(s));
1
user1814380

TLDR: لا يمكنك تحويل قيمة التاريخ فقط بشكل موثوق ، وإرسال سلسلة بدلاً من ذلك ...

... أو على الأقل هذا هو كيف يجب أن تبدأ كل هذه الإجابات تقريبًا.

هناك عدد من مشكلات التحويل التي تحدث هنا.

هذا تاريخ بلا وقت

يبدو أن شيئًا ما مفقودًا هو عدد الأصفار الزائدة الموجودة في السؤال - من شبه المؤكد أنه بدأ كتاريخ بدون وقت:

/Date(1224043200000)/

عند تنفيذ ذلك من وحدة تحكم جافا سكريبت كتاريخ جديد (أساس العديد من الإجابات)

new Date(1224043200000)

لقد حصلت:

 enter image description here 

ربما كان السائل الأصلي في EST وكان له تاريخ خالص (sql) أو DateTime (وليس DateTimeOffset) مع منتصف الليل.

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

(حسب المنطقة الزمنية

ولكن ، إذا قمت بتنفيذ الكود أعلاه على جهاز مع منطقة زمنية مختلفة (PST على سبيل المثال):

 enter image description here 

ستلاحظ أننا الآن يوم متأخر في هذه المنطقة الزمنية الأخرى. لن يتم إصلاح هذا عن طريق تغيير برنامج التسلسل (الذي سيظل يتضمن منطقة زمنية بتنسيق ISO)

المشكلة

ليس للتاريخ (sql) و DateTime (.net) منطقة زمنية ، ولكن بمجرد تحويلهما إلى شيء ما (جافا سكريبت يستنتج من خلال json في هذه الحالة) ، فإن الإجراء الافتراضي في .net هو افتراض المنطقة الزمنية الحالية .

الرقم الذي تنشئه عملية التسلسل هو مللي ثانية منذ يونيكس إيبوك أو:

(DateTimeOffset.Parse("10/15/2008 00:00:00Z") - DateTimeOffset.Parse("1/1/1970 00:00:00Z")).TotalMilliseconds;

وهو شيء يأخذ التاريخ () الجديد في جافا سكريبت كمعلمة. Epoch هو من UTC ، والآن لديك معلومات المنطقة الزمنية سواء كنت تريد ذلك أم لا.

الحلول الممكنة:

قد يكون من الأكثر أمانًا إنشاء خاصية سلسلة على كائن متسلسل يمثل التاريخ فقط - من غير المحتمل أن تربك السلسلة التي تحمل "10/15/2008" أي شخص آخر بهذه الفوضى. على الرغم من أنه يتعين عليك توخي الحذر من ناحية التحليل: https://stackoverflow.com/a/31732581

ومع ذلك ، وبروح تقديم إجابة على السؤال المطروح ، كما يلي:

function adjustToLocalMidnight(serverMidnight){ 
  var serverOffset=-240; //injected from model? <-- DateTimeOffset.Now.Offset.TotalMinutes
  var localOffset=-(new Date()).getTimezoneOffset(); 
  return new Date(date.getTime() + (serverOffset-localOffset) * 60 * 1000)
}

var localMidnightDate = adjustToLocalMidnight(new Date(parseInt(jsonDate.substr(6))));
0
b_levitt