मैं Microsoft JSON दिनांक कैसे प्रारूपित करूं?


1999

मैं jax के साथ Ajax में अपनी पहली दरार ले रहा हूँ । मुझे अपना डेटा मेरे पेज पर मिल रहा है, लेकिन मुझे JSON डेटा के साथ कुछ परेशानी हो रही है जो दिनांक डेटा प्रकारों के लिए वापस आ गई है। मूल रूप से, मुझे एक स्ट्रिंग वापस मिल रही है जो इस तरह दिखती है:

/Date(1224043200000)/

किसी के लिए JSON से बिल्कुल नया - मैं इसे लघु तिथि प्रारूप में कैसे प्रारूपित करूं? यह कहीं jQuery कोड में संभाला जाना चाहिए? मैंने बिना किसी सफलता के jQuery.UI.datepickerप्लगइन का उपयोग करने की कोशिश की है $.datepicker.formatDate()

FYI करें: यहाँ समाधान है जो मैं यहाँ उत्तरों के संयोजन का उपयोग करके आया हूँ:

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

इस समाधान ने कॉलबैक विधि से मेरी वस्तु प्राप्त की और दिनांक प्रारूप लाइब्रेरी का उपयोग करके पृष्ठ पर तिथियों को ठीक से प्रदर्शित किया।


26
यह दिलचस्प हो सकता है: hanselman.com/blog/…
citronas

6
/Date(...)/ प्रारूप Microsoft के अंतर्निहित JSON दिनांक प्रारूप के लिए विशिष्ट है - यह किसी भी मानक का हिस्सा नहीं है, और JSON, जावास्क्रिप्ट से आ रहा है, का एक मानक है: आईएसओ प्रारूप जावास्क्रिप्ट निर्दिष्ट करता है: stackoverflowa-a / 15952652/176877 तो, यह प्रश्न Microsoft के JSON दिनांक प्रारूप के लिए विशिष्ट है। मैंने इसे स्पष्ट करने के लिए शीर्षक को संशोधित किया।
बजे क्रिस मोशचिनी

15
आप मजाक कर रहे हो! Microsoft ने JSON पर अपनी खुद की स्पिन पर मुहर लगा दी है! और तारीखों पर !! वे कब सीखेंगे!
Nick.McD मत्स्यांगना

.NET साइड पर Newtonsoft JSON का उपयोग करें और JS साइड पर अच्छे टाइप किए गए मान रखने के लिए, बस उपयोग करें: github.com/RickStrahl/json.date-extensions
baHI

आप JSON के बजाय JSON ++ का उपयोग कर सकते हैं। JSON ++ JSON से समान है लेकिन जावास्क्रिप्ट प्रकारों के लिए समर्थन के साथ जैसे कि Date
11

जवाबों:


1688

eval()इसकी आवश्यकता नही है। यह ठीक काम करेगा:

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

substr()समारोह बाहर ले जाता है /Date(हिस्सा है, और parseInt()समारोह पूर्णांक हो जाता है और ध्यान नहीं देता है )/अंत में। परिणामी संख्या को Dateकंस्ट्रक्टर में पारित किया जाता है ।


मैंने जानबूझकर मूलांक (दूसरा तर्क parseInt) को छोड़ दिया है ; देखने के नीचे मेरी टिप्पणी

इसके अलावा, मैं रोरी की टिप्पणी से पूरी तरह सहमत हूं : इस पुराने प्रारूप पर ISO-8601 तिथियां पसंद की जाती हैं - इसलिए इस प्रारूप का उपयोग आम तौर पर नए विकास के लिए नहीं किया जाना चाहिए। एक उत्कृष्ट विकल्प के लिए उत्कृष्ट Json.NET लाइब्रेरी देखें जो ISO-8601 प्रारूप का उपयोग करके तिथियों को क्रमबद्ध करता है।

ISO-8601 के लिए JSON दिनांक स्वरूपित है, बस स्ट्रिंग को Dateकंस्ट्रक्टर में पास करें :

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

4
@Broam: दोनों विधियाँ (फ़ंक्शन और इस उत्तर को बदलें) यदि MS प्रारूप को बदलता है तो उसे बदलना होगा।
रॉय टिंकर

23
क्या आप इसे मूलांक वार तिथि = नई तिथि (parseInt (jsonDate.substr (6), 10)) के साथ अपडेट कर सकते हैं;
बजे जेम्स किबर्ज़

6
@JamesKyburz: हर नियम के अपवाद हैं, और मुझे लगता है कि यह तब होता है जब कोई अपवाद लागू होता है। .NET से JSON दिनांक संख्याओं में कभी भी अग्रणी "0" नहीं होता है, इसलिए हम सुरक्षित रूप से मूलांक छोड़ सकते हैं।
रॉय टिंकर

22
यह ध्यान देने योग्य है कि यह दिनांक प्रारूप बहुत बुरा है और सामान्य चालन JSON में ISO-8601 स्वरूपित तिथियों के लिए है। देखें hanselman.com/blog/…
रोरी

4
यह दृष्टिकोण टाइमज़ोन पर विचार करने में विफल रहता है इसलिए आपके सर्वर और उपयोगकर्ता अलग-अलग टाइमज़ोन में होने पर गंभीर समस्याएं पैदा कर सकते हैं। मैंने नीचे एक उत्तर पोस्ट किया है जो WCF और जावास्क्रिप्ट पक्षों पर इससे निपटने के लिए एक बहुत ही त्वरित और आसान तरीका बताता है: stackoverflow.com/a/10743718/51061
स्कॉट विलेक

135

JSON से दिनांक प्राप्त करने के लिए आप इसका उपयोग कर सकते हैं:

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

और फिर आप इसे प्रदर्शित करने के लिए जावास्क्रिप्ट तिथि प्रारूप स्क्रिप्ट (1.2 केबी जब खनन और gzipped) का उपयोग कर सकते हैं।


7
लाइन के साथ कुछ भी गलत नहीं है, अनुक्रम \ // है। पहले स्लैश बच जाता है इसलिए यह एक टिप्पणी की तरह नहीं गिना जाता है। यह आपका संपादक आपको बरगला रहा है, लाइन ठीक काम करेगी।
andreialecu

152
@rball, बकवास:jsonDate = new Date(+jsonDate.replace(/\/Date\((\d+)\)\//, '$1'));
eyelidlessness

39
pst सही था, इसे 'eval' के बिना कई तरीकों से करना संभव है। क्रॉकफोर्ड का कहना है कि 'इवल इज़ इविल' क्योंकि यह कम पठनीय है और कम सुरक्षित है, इसके अलावा वह आगे यह भी कह सकता है कि यह कम कुशल और अधिक खतरनाक है क्योंकि यह जावास्क्रिप्ट कंपाइलर को हिट करता है।
मार्क रोजर्स

13
@ ईडी: new Functionलगभग उतना ही बुरा है eval: dev.opera.com/articles/view/efficient-javascript/…
मार्सेल कोर्पल

5
@ ईडी: यह ईवैल का दूसरा रूप है, और केवल 'बुराई' के रूप में है। इसके बजाय स्ट्रिंग को पार्स करें (नीचे मेरा उत्तर देखें)
रॉय टिंकर

98

Newtonsoft Json.NET का उपयोग करने वालों के लिए , IE8, Firefox 3.5 प्लस Json.NET में नेटिव JSON के माध्यम से इसे कैसे करें, इस पर पढ़ें ।

इसके अलावा Json.NET द्वारा लिखी गई तारीखों के प्रारूप को बदलने के लिए प्रलेखन उपयोगी है: Json.NET के साथ तिथियों को क्रमबद्ध करना

उन लोगों के लिए जो बहुत आलसी हैं, यहां त्वरित कदम हैं। जैसा कि JSON में एक ढीला DateTime कार्यान्वयन है, आपको इसका उपयोग करने की आवश्यकता है IsoDateTimeConverter()। ध्यान दें कि Json.NET 4.5 के बाद से डिफ़ॉल्ट तिथि प्रारूप आईएसओ है, इसलिए नीचे दिए गए कोड की आवश्यकता नहीं है।

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

JSON के रूप में के माध्यम से आ जाएगा

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

अंत में, कुछ जावास्क्रिप्ट आईएसओ तिथि को जावास्क्रिप्ट तिथि में बदलने के लिए:

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

6
जावास्क्रिप्ट तिथि निर्माता आपके लिए स्ट्रिंग को पार्स कर सकता है:new Date("2009-04-12T20:44:55")
डेविड हॉग

5
चेतावनी - तिथि () कंस्ट्रक्टर प्रारूप और पार्सिंग ईसीएमएस्क्रिप्ट 6 से पहले गैर-मानक हैं। उदाहरण के लिए, IE 9 आप उस तारीख को मानते हैं जो कंस्ट्रक्टर को स्थानीय समय के रूप में देता है, भले ही वह IS0-8601 में हो, जो हर जगह यूसीटी के रूप में निहित है। यदि आप पुराने ब्राउज़र का समर्थन करते हैं तो डेट कंस्ट्रक्टर पर भरोसा न करें। codeofmatt.com/2013/06/07/…
DanO

गैर-यूटीसी तिथि भेजना जल्द या बाद में आपको परेशानी में डाल देगा।
22

यहाँ पार्टी में थोड़ी देर, लेकिन क्या होगा (+ [[1], + [२] - १, + [a] ३, + [a ४], + [a ५], + [a ६] ; इस संदर्भ में प्रतिनिधित्व करें?
यनंत

@yanant - +a[1]आदि रेगेक्स के सरणी टुकड़ों का प्रतिनिधित्व करता है और +इसे एक नंबर पर ले जाता है, इसलिए +a[1]बराबर होता है 2009आदि यहाँ सरणी का टूटना है: 0: "2009-04-12T20:44:55" 1: "2009" 2: "04" 3: "12" 4: "20" 5: "44" 6: "55"
जेसन जोंग

67

मूल उदाहरण:

/Date(1224043200000)/  

WCF द्वारा निर्मित प्रारूपण को प्रतिबिंबित नहीं करता है, जब WCF REST के माध्यम से अंतर्निहित JSON क्रमांकन का उपयोग करते हुए दिनांक भेजते हैं। (कम से कम .NET 3.5, SP1 पर)

मुझे यहाँ उत्तर मददगार लगा, लेकिन रेगेक्स के लिए थोड़ा-सा संपादन आवश्यक है, क्योंकि ऐसा प्रतीत होता है कि WCF JSON में लौटे समय (1970 से) की संख्या पर टाइमजोन GMT ऑफसेट को जोड़ा जा रहा है।

एक 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)/

मूल्य के हिस्से के रूप में शामिल टाइमजोन ऑफसेट को नोटिस करें।

संशोधित रेगेक्स:

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

यह थोड़ा और अधिक उत्सुक है और केवल पहले नंबर पर ही नहीं, बल्कि परागों के बीच सब कुछ पकड़ लेता है। 1970 का परिणामी समय का पापी, प्लस टाइमज़ोन ऑफसेट सभी को डेट ऑब्जेक्ट प्राप्त करने के लिए eval में खिलाया जा सकता है।

प्रतिस्थापन के लिए जावास्क्रिप्ट की परिणामी लाइन है:

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

10
यह गलत है, नई तिथि (1224043200000-0600) केवल तारीख से 600 घटाएगी, इस मामले में 600 मिलिसेकंड, 6 घंटे नहीं जैसा कि होना चाहिए।
एरियल


मुझे लगता है कि यदि आप .NET (जो डिफ़ॉल्ट व्यवहार है) में TimeTime ऑब्जेक्ट पर टाइमज़ोन होने पर ही टाइमज़ोन ऑफ़सेट शामिल है। यदि आपकी तिथि UTC में है, तो DateTime.SpecifyKind (दिनांक, DateTimeKind.UTC) का उपयोग करें और जब आप इसे बिना किसी ऑफसेट के साथ अनुक्रमित करते हैं, तो आपको उचित UTC मान मिलेगा, जिसे आप फिर से उपयोगकर्ता के टाइमज़ोन में बदल सकते हैं। यदि यह स्थानीय समय में है, तो .ToUniversalTime () का उपयोग करें और यह UTC में परिवर्तित हो जाएगा, और आपके लिए पहले से निर्दिष्ट "Kind" है।
jvenema

जावास्क्रिप्ट में -0100 एक द्विआधारी स्ट्रिंग हो जाएगा तो लापरवाह हो!
13

एक बार जब आप डब्ल्यूसीएफ से जेएस में परिवर्तित होने की तिथि प्राप्त कर लेते हैं, तो रिवर्स के बारे में कैसे। आप पूर्णांक के रूप में तारीख प्राप्त करेंगे (date.getTime () का उपयोग करके) जिसे आप उसी WCF में पास करना चाहते हैं?
नितिनसिंह

65

अपने आप को दोहराएं नहीं - स्वचालित रूप से दिनांक रूपांतरण का उपयोग करें $.parseJSON()

आपकी पोस्ट के उत्तर जावास्क्रिप्ट तिथियों को मैन्युअल तारीख रूपांतरण प्रदान करते हैं। मैंने jQuery का $.parseJSON()बस थोड़ा सा विस्तार किया है , इसलिए जब आप इसे निर्देश देते हैं तो यह स्वचालित रूप से तिथियों को पार्स करने में सक्षम होता है। यह ASP.NET प्रक्रियाओं को स्वरूपित तारीखों ( /Date(12348721342)/) के साथ-साथ आईएसओ स्वरूपित तिथियों ( 2010-01-01T12.34.56.789Z) जो ब्राउज़र में देशी JSON फ़ंक्शन (और json2.js जैसे पुस्तकालयों) द्वारा समर्थित हैं।

वैसे भी। यदि आप अपना दिनांक रूपांतरण कोड बार-बार दोहराना नहीं चाहते हैं तो मेरा सुझाव है कि आप इस ब्लॉग पोस्ट को पढ़ें और कोड प्राप्त करें जो आपके जीवन को थोड़ा आसान बना देगा।


61

यदि आप जावास्क्रिप्ट में कहते हैं,

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

आप देखेंगे कि यह सही तिथि है, और आप जावास्क्रिप्ट कोड में कहीं भी किसी भी ढांचे के साथ इसका उपयोग कर सकते हैं।


3
इसे समाप्त करने के अलावा मैंने भी सोचा होगा: var thedate = / Date (1224043200000) /; कम से कम मेरे लिए ...
rball

2
दिनांक () और दिनांक (1224043200000) दोनों क्रोम और फ़ायरफ़ॉक्स दोनों में समान परिणाम देते हैं। यकीन नहीं होता कि यह पुराने ब्राउज़रों में काम करता है, लेकिन यह उत्तर अब ब्राउज़र में काम नहीं करता है।
जेम्स

@ जेम्स, हाँ यह ब्राउज़र की वर्तमान तिथि दे रहा है। :(
विस्सु

9
आपको इसे "नई तिथि (1224043200000)" के रूप में लिखना होगा।
BrainSlugs83

60

डेमो जाँचने के लिए यहाँ क्लिक करें

जावास्क्रिप्ट / 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"


उपरोक्त विधि के लिए सिर्फ एक सुधार। function formatearFecha (fec) {var value = new Date (parseInt (fec.replace / / (^। *) (| (+ +]। * $) / g, '')); var mes / value.getMonth (); var dia = value.getDate (); var date = dia + "/" + mes + "/" + value.getFullYear (); अगर (dia <10) date = date.substr (0, 0) + '0' + dia + date.substr (1); if (mes <10) date = date.substr (0, 3) + '0' + mes + date.substr (4); return date;} दिनांक स्वरूपित दिनांक; ddMMyyyy चीयर्स।!
मटीस

38

अपडेट किया गया

हमारे पास एक आंतरिक यूआई लाइब्रेरी है जिसे माइक्रोसॉफ्ट के एएसपी.नेट बिल्ट-इन /Date(msecs)/जेएसएन प्रारूप के साथ सामना करना पड़ता है, जैसे , मूल रूप से यहां के बारे में पूछा गया है, और जेएसईएन के जेएसएन सहित अधिकांश जेएनएस की तारीख प्रारूप 2014-06-22T00:00:00.0। इसके अलावा, हमें Oldie की अक्षमता के साथ कुछ भी लेकिन 3 दशमलव स्थानों के साथ सामना करने की आवश्यकता है ।

हम पहले पता लगाते हैं कि हम किस तरह की तारीख का उपभोग कर रहे हैं, इसे सामान्य जावास्क्रिप्ट Dateऑब्जेक्ट में पार्स करें , फिर इसे प्रारूपित करें।

1) Microsoft तिथि प्रारूप का पता लगाएं

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

2) आईएसओ तिथि प्रारूप का पता लगाएं

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) पार्स एमएस तिथि प्रारूप:

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

4) पार्स आईएसओ तिथि प्रारूप।

हमारे पास कम से कम यह सुनिश्चित करने का एक तरीका है कि हम मानक आईएसओ तिथियों के साथ काम कर रहे हैं या आईएसओ तिथियां हमेशा तीन मिलीसेकंड स्थानों ( ऊपर देखें ) के लिए संशोधित हैं , इसलिए पर्यावरण के आधार पर कोड अलग है।

4 ए) पार्स मानक आईएसओ तिथि प्रारूप, पुराने मुद्दों के साथ सामना:

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 बी) एक निश्चित तीन मिलीसेकंड दशमलव स्थानों के साथ पार्स आईएसओ प्रारूप - बहुत आसान:

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

नीचे दिया गया पुराना उत्तर इस तिथि को jQuery के अपने JSON पार्सिंग में फ़ॉर्मेट करने के लिए उपयोगी है ताकि आपको तार के बजाय दिनांक ऑब्जेक्ट मिलें, या यदि आप अभी भी किसी तरह jQuery <1.5 में अटके हुए हैं।

पुराना उत्तर

यदि आप ASP.NET MVC के साथ jQuery 1.4 के अजाक्स फ़ंक्शन का उपयोग कर रहे हैं, तो आप सभी DateTime गुणों को दिनांक ऑब्जेक्ट्स में बदल सकते हैं:

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

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

JQuery 1.5 में आप parseJSONAjax कॉल में कन्वर्टर्स विकल्प का उपयोग करके विश्व स्तर पर विधि को ओवरराइड करने से बचा सकते हैं ।

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

दुर्भाग्यवश आपको विश्व स्तर पर जगह-जगह पार्स करने के लिए पुराने eval रूट पर स्विच करना होगा - अन्यथा आपको उन्हें अधिक केस-बाय-केस आधार पोस्ट-पार्स पर बदलने की आवश्यकता है।


27

JSON में कोई दिनांक प्रकार नहीं बनाया गया है । यह कुछ युगों से सेकंड / मिलीसेकंड की संख्या जैसा दिखता है। यदि आप युग जानते हैं तो आप समय की सही मात्रा में जोड़कर तारीख बना सकते हैं।


यह गलत है, JSON जावास्क्रिप्ट तिथियों का उपयोग करता है, अतिरिक्त समय क्षेत्र की जानकारी के साथ- युग जावास्क्रिप्ट तिथि वर्ग के युग (स्पष्ट कारणों के लिए) के समान है।
ब्रेनस्ल्गस83

3
@ BrainSlug83 - यह उत्तर इस दावे के लिए एक संदर्भ प्रदान करता है कि JSON में अंतर्निहित तिथि प्रकार नहीं है। यदि आप असहमत हैं, तो कृपया एक वैकल्पिक संदर्भ प्रदान करें। (आप एक विशिष्ट रूपरेखा के बारे में नहीं सोच रहे हैं, जो तारीखों को दर्शाने के लिए एक स्ट्रिंग प्रारूप पर तय की गई है। आप JSON मानक का हिस्सा नहीं हैं, वास्तव में यह नहीं हो सकता क्योंकि यह एक स्ट्रिंग को शामिल करना असंभव होगा जो कि नहीं है एक तिथि के रूप में लिया जाना चाहिए, लेकिन ऐसा होता है कि वर्णों का एक सेट होता है जो तिथि पैटर्न से मेल खाते हैं।)
nnnnnn

25

मुझे इस समस्या के समाधान की तलाश भी करनी पड़ी और आखिरकार मैं पल भर में आ गया। जेएस एक अच्छी लाइब्रेरी है जो इस तारीख के प्रारूप को पार्स कर सकती है।

var d = moment(yourdatestring)

इसने मेरे लिए कुछ सिरदर्द को बचाया तो मुझे लगा कि मैं इसे आपके साथ साझा करूंगा। :)
आप इसके बारे में कुछ और जानकारी यहाँ पा सकते हैं: http://momentjs.com/


24

जब मैं इनलाइन स्क्रिप्ट में ऑब्जेक्ट्स लिखने के लिए 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 सही ढंग से deserialize करेगा, मैंने उपयोग किया:

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

22

JQuery 1.5 में, जब तक आपके पास पुराने ब्राउज़रों को कवर करने के लिए json2.js है, तब तक आप अजाक्स से आने वाली सभी तिथियों का विवरण निम्नानुसार कर सकते हैं:

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

मैंने तर्क शामिल किया है जो मानता है कि आप सर्वर से सभी तिथियों को यूटीसी (जो आपको चाहिए) भेजते हैं; उपभोक्ता को तब एक जावास्क्रिप्ट Dateऑब्जेक्ट मिलता है जिसके पास इसे प्रतिबिंबित करने के लिए उचित टिक मूल्य होता है। अर्थात्, getUTCHours()तारीख पर कॉलिंग , आदि उसी मूल्य को वापस करेगा जैसा उसने सर्वर पर किया था, और कॉलिंग getHours()उपयोगकर्ता के स्थानीय टाइमज़ोन में उनके ब्राउज़र द्वारा निर्धारित मूल्य को वापस कर देगा।

यह समय-समय पर ऑफसेट के साथ WCF प्रारूप को ध्यान में नहीं रखता है , हालांकि इसे जोड़ना अपेक्षाकृत आसान होगा।


बस एक नोट के रूप में: कोड को काम करने के लिए आपको स्ट्रिंग प्रकार की शुरुआत विधि तैयार करनी होगी
ह्यूगो जैपाटा

21

JQuery UI डेटपिकर का उपयोग करना - वास्तव में केवल तभी समझ में आता है यदि आप पहले से ही jQuery UI शामिल कर रहे हैं:

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

उत्पादन:

15 अक्टूबर, 2008


20

यह मत सोचो। जैसे हमने दशकों तक किया है, इस युग के बाद से 1 जनवरी 1970 की आधी रात GMT / UTC / और सेकंड (या मिलीसेकंड) की संख्या में वास्तविक मानक मानक से एक संख्यात्मक ऑफसेट पास करें। जावास्क्रिप्ट इसे पसंद करता है, जावा इसे पसंद करता है, सी इसे पसंद करता है, और इंटरनेट इसे पसंद करता है।


2
और बहुत बुरा वहाँ से चुनने के लिए 20 से अधिक युग हैं। en.wikipedia.org/wiki/Epoch_(reference_date)
जेरथ


18

इन उत्तरों में से प्रत्येक में एक चीज समान है: वे सभी तिथियों को एक ही मूल्य (आमतौर पर एक स्ट्रिंग) के रूप में संग्रहीत करते हैं।

एक अन्य विकल्प JSON की अंतर्निहित संरचना का लाभ उठाना है, और संख्याओं की सूची के रूप में एक तारीख का प्रतिनिधित्व करना है:

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

बेशक, आपको यह सुनिश्चित करना होगा कि बातचीत के दोनों छोर प्रारूप (वर्ष, माह, दिन) पर सहमत हों, और कौन से क्षेत्र तारीखों के हों, ... लेकिन इसमें तारीख के मुद्दे से पूरी तरह परहेज करने का फायदा है -तत्कालीन रूपांतरण। यह सभी संख्याएँ हैं - कोई तार नहीं। इसके अलावा, आदेश का उपयोग करते हुए: वर्ष, महीना, दिन भी तिथि के अनुसार उचित छंटाई की अनुमति देता है।

यहाँ बॉक्स के बाहर सोच - JSON दिनांक को एक स्ट्रिंग के रूप में संग्रहीत करने की आवश्यकता नहीं है।

इस तरह से यह कर के लिए एक और बोनस है कि आप आसानी से (और कुशलता से) जिस तरह का लाभ उठाकर एक दिए गए वर्ष या महीने के लिए सभी रिकॉर्ड का चयन कर सकते है CouchDB सरणी मूल्यों पर हैंडल किए जाते हैं।


वहाँ है JSON, जो आरएफसी 3339 स्वरूप है में दिनांक के लिए एक मानक प्रारूप।
gnasher729

@gnasher, यह अच्छा होगा, लेकिन ऐसा नहीं है। RFC 7159 से 3339 या इसके विपरीत कोई संदर्भ नहीं हैं। कोई डे जुरे मानक JSON दिनांक प्रारूप नहीं है। जो कुछ बचे हैं वे सभी वास्तविक मानक हैं, जिनमें से प्रत्येक में पेशेवरों / विपक्ष हैं। मानकों के बारे में यह अच्छी बात है।
मार्क एल।

17

भयानक धागे में पोस्टिंग:

var d = new Date(parseInt('/Date(1224043200000)/'.slice(6, -2)));
alert('' + (1 + d.getMonth()) + '/' + d.getDate() + '/' + d.getFullYear().toString().slice(-2));

1
अच्छा विचार है, लेकिन क्या होगा अगर एक टाइमज़ोन ऑफसेट शामिल हो? स्लाइस (6, -2) के बजाय उस स्थिति में रूट (6) का उपयोग करना बेहतर है - नीचे मेरा उत्तर देखें।
रॉय टिंकर

17

यहां एक और दृष्टिकोण जोड़ने के लिए, "टिक दृष्टिकोण" जिसे डब्ल्यूसीएफ लेता है, टाइमजोन के साथ समस्याओं से ग्रस्त है, यदि आप अत्यंत सावधान नहीं हैं जैसे कि यहां और अन्य स्थानों पर वर्णित है । इसलिए मैं अब आईएसओ 8601 प्रारूप का उपयोग कर रहा हूं जो .NET और जावास्क्रिप्ट दोनों का विधिवत समर्थन करता है जिसमें टाइमज़ोन ऑफ़सेट शामिल हैं। नीचे विवरण हैं:

WCF / .NET में:

जहां क्रिएशनडेट एक System.DateTime है; ToString ("o") .NET का राउंड-ट्रिप फॉर्मेट स्पेसिफ़ायर का उपयोग कर रहा है जो ISO 8601-कंप्लेंट डेट स्ट्रिंग उत्पन्न करता है

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

जावास्क्रिप्ट में

JSON को पुनः प्राप्त करने के बाद, मैं तारीखों का निर्माण करता हूँ JavaSript तारीख की वस्तुओं का उपयोग करता है डेट कन्स्ट्रक्टर का उपयोग करता है जो आईएसओ 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());
    }
)

एक बार जब आपके पास एक जावास्क्रिप्ट तारीख होती है, तो आप सभी सुविधाजनक और विश्वसनीय तिथि विधियों का उपयोग कर सकते हैं , जैसे -टेडस्ट्रिंग , टोलेकालेस्ट्रिंग , आदि।


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

क्या jQuery लाइब्रेरी का उपयोग किए बिना एक और विकल्प है?


यह एक नया प्रश्न है और इसे अपने प्रश्न के रूप में पूछा जाना चाहिए और यहां एम्बेड नहीं किया जाना चाहिए।
स्पेंसर सुलिवन

11

इससे आपको भी मदद मिल सकती है।

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

10

नीचे 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;
}

10

आप जावास्क्रिप्ट लाइब्रेरी क्षणों का उपयोग भी कर सकते हैं। जेएस , जो तब काम आता है जब आप विभिन्न स्थानीय स्वरूपों के साथ काम करते हैं और दिनांक मानों के साथ अन्य संचालन करते हैं:

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');

9

मुझे इस तरह की तारीख मिलती है:

"/Date(1276290000000+0300)/"

कुछ उदाहरणों में दिनांक कुछ भिन्न स्वरूपों में है:

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

आदि।

तो मैं निम्नलिखित RegExp के साथ आया:

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

और अंतिम कोड है:

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

आशा है ये मदद करेगा।

अद्यतन: मुझे यह लिंक Microsoft से मिला: मैं JSON के साथ दिनांकित कैसे कर सकता हूँ?

ऐसा लगता है जैसे हम सब देख रहे हैं।


1
Regexp प्रतिस्थापन धीमी हैं ... मूल (6) का उपयोग करके पूर्णांक भाग को पकड़ना और पार्सइंट को पास करना बहुत तेज़ है () - नीचे मेरा उत्तर देखें।
रॉय टिंकर

इसके अलावा
मिलिसेकंड

9

आईएसओ मानक की जाँच करें; इस तरह की तरह:

yyyy.MM.ddThh:mm

बन जाता है 2008.11.20T22:18


JSON स्कीमा के अनुसार, "दिनांक-समय" प्रारूप RFC 3339, खंड 5.6 से मेल खाता है। तो आपको GMT में तारीखों के लिए "yyyy-MM-ddTHH: mm: ssZ" लिखना चाहिए, या Z को एक समय क्षेत्र जैसे + hh: mm से बदल दिया गया।
gnasher729 15

समस्या यह है कि WCF और अन्य "पुराने" MS JSON सीरियललाइज़ेशन इस प्रारूप का उपयोग नहीं करते हैं, और इसका हिसाब देना पड़ता है।
मार्क एल।

9

यह निराश करने वाला है। मेरा समाधान ASP.NET के JavaScriptSerializer द्वारा उत्पन्न मूल्य से "/ और" को पार्स करने का था, ताकि JSON की तारीख शाब्दिक न हो, फिर भी इसे ब्राउज़र द्वारा एक तिथि के रूप में व्याख्या किया जाता है, जो कि सभी वास्तव में है। चाहते हैं:{"myDate":Date(123456789)}

कस्टम जावास्क्रिप्ट के लिए DateTime?

मुझे रॉय टिंकर की टिप्पणी की सटीकता पर जोर देना चाहिए। यह कानूनी JSON नहीं है। यह जावास्क्रिप्ट को समस्या के लिए समस्या को हटाने के लिए सर्वर पर एक गंदा, गंदा हैक है। यह एक JSON पार्सर को चोक कर देगा। मैंने इसका इस्तेमाल मैदान से बाहर होने के लिए किया था, लेकिन मैं इसका इस्तेमाल नहीं करता। हालाँकि, मुझे अभी भी सबसे अच्छा जवाब यह लगता है कि सर्वर तारीख को कैसे बदलता है, उदाहरण के लिए, आईएसओ कहीं और उल्लेख किया गया है।


2
यह कानूनी JSON नहीं है। यह केवल तभी काम करेगा जब एक जावास्क्रिप्ट दुभाषिया के साथ eval'ing। लेकिन अगर आप JSON डिकोडर का उपयोग कर रहे हैं, तो यह चोक हो जाएगा।
रॉय टिंकर

1
माना। और अगर मैं डेटा के इस एक टुकड़े के साथ काम कर रहा था, तो मैं इस पर विचार नहीं करूंगा। लेकिन अगर मैं कई तिथियों और अन्य संपत्तियों की वस्तु के साथ काम कर रहा हूं, तो एक बार में संपत्तियों को निकालने की तुलना में पूरी बात निकालना आसान है। अंत में, जड़ मुद्दा एक (कानूनी) JSON तारीख की कमी है। जब तक मौजूद नहीं है, तब तक हम अपने रचनात्मक हैक से बचे हुए हैं।
StarTrekRedneck

8

देर से पोस्ट, लेकिन उन लोगों के लिए जिन्होंने इस पोस्ट को खोजा।

इसकी कल्पना करें:

    [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 की सुविधा का उपयोग कर रहा हूं। यह थोड़ा आलसी है, लेकिन मुझे यह पसंद है और यह काम करता है। बस एक नोट: प्रोफ़ाइल एक कस्टम वर्ग है जिसे मैंने अपने वेब एप्लिकेशन प्रोजेक्ट के लिए बनाया है।


इसलिए हर बार आप एक नई भूमिका [अधिकृत (भूमिकाएं = "मानव संसाधन")] जोड़ते हैं, आपको संकलित और तैनात करना पड़ता है? वाह .... :)
एलेक्स नोल्को

1
यदि यह JSON सेवा है तो पुनर्निर्देश गलत लगता है। मैं एक 404 नहीं लौटा पाया, अगर इनपुट कुंजी बहुत अमान्य है तो संभवतः इसे नहीं पाया जा सकता है, (और अगर यह वास्तव में नहीं मिला है तो 404 भी)। जब मेरे उपयोगकर्ता लॉग इन नहीं होते हैं तो मैं 403 मना कर देता हूं।
रिचर्ड कोरीफील्ड

यह एक "पुन: प्रयोज्य" विधि है। उदाहरण के लिए, यदि मैं किसी अन्य दृश्य से उपयोगकर्ता डेटा प्राप्त करना चाहता था, तो जब तक मैं आईडी की आपूर्ति करता हूं, मैं इसे प्राप्त कर सकता हूं। हालाँकि, यदि Id की आपूर्ति नहीं की गई है, तो उपयोगकर्ता का चयन करने के लिए पृष्ठ उपयोगकर्ताओं की सूची (अनुक्रमणिका) पर पुनर्निर्देशित करता है। एप्लिकेशन के लिए सरल समाधान की जरूरत है, जिस तरह से उस समय मेरे दिमाग ने इसे पकाया।
रे लिंडर

8

FYI करें, सर्वर साइड पर पायथन का उपयोग करने वाले किसी के लिए: datetime.datetime ()। Ctime () एक स्ट्रिंग देता है जो मूल रूप से "नई तिथि ()" द्वारा पार्स करने योग्य है। यही है, यदि आप एक नया datetime.datetime उदाहरण (जैसे datetime.datetime.now) बनाते हैं, तो स्ट्रिंग को JSON स्ट्रिंग में शामिल किया जा सकता है, और फिर उस स्ट्रिंग को डेट कंस्ट्रक्टर के पहले तर्क के रूप में पास किया जा सकता है। मुझे अभी तक कोई अपवाद नहीं मिला है, लेकिन मैंने इसे बहुत कठोरता से या तो परीक्षण नहीं किया है।


8

Mootools समाधान:

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

Mootools- अधिक की आवश्यकता है। फ़ायरफ़ॉक्स 3.6.3 और IE 7.0.5730.13 पर म्यूटूल-1.2.3.1-अधिक का उपयोग करके परीक्षण किया गया


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


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.