ASP.NET MVC JsonResult दिनांक स्वरूप


248

मेरे पास एक नियंत्रक क्रिया है जो प्रभावी रूप से केवल मेरे मॉडल के JsonResult को लौटाती है। इसलिए, मेरे तरीके में मेरे पास कुछ इस तरह है:

return new JsonResult(myModel);

यह अच्छी तरह से काम करता है, एक समस्या को छोड़कर। मॉडल में एक तारीख संपत्ति है और यह इस तरह से Json परिणाम में वापस आ गया प्रतीत होता है:

"\/Date(1239018869048)\/"

मुझे तारीखों से कैसे निपटना चाहिए ताकि वे उस प्रारूप में वापस आ जाएं, जिसकी मुझे आवश्यकता है? या मैं इस प्रारूप को स्क्रिप्ट में कैसे संभाल सकता हूं?


मैंने अपना json नेट परिणाम उसी समस्या के लिए पोस्ट किया है, यह तिथि को आईएसओ प्रारूप में रूपांतरित करता है जिससे यह काम करना बहुत आसान हो जाता है। stackoverflow.com/questions/15778599/…
कीरान

कृपया नीचे दिए गए लिंक पर गौर करें। सीधे आगे। stackoverflow.com/a/60392503/5962626
मोहम्मदी

जवाबों:


195

बस कैस्परऑन के जवाब पर विस्तार करने के लिए ।

JSON कल्पना दिनांक मूल्यों के लिए खाते में नहीं है। MS को एक कॉल करना था, और उन्होंने जो रास्ता चुना वह था स्ट्रिंग्स के जावास्क्रिप्ट प्रतिनिधित्व में एक छोटी सी चाल का फायदा उठाने के लिए: स्ट्रिंग शाब्दिक "/" "\ /" के समान है, और एक स्ट्रिंग शाब्दिक कभी भी "के लिए क्रमबद्ध नहीं होगा " \ / "(यहां तक ​​कि" \ / "को" \\ / "मैप करना होगा)।

बेहतर विवरण के लिए http://msdn.microsoft.com/en-us/library/bb299886.aspx#intro_to_json_topic2 देखें (जावास्क्रिप्ट साहित्य से JSON तक स्क्रॉल करें)

JSON के गले के बिंदुओं में से एक तारीख / समय शाब्दिक की कमी है। जब वे पहली बार JSON से भिड़ते हैं तो कई लोग यह जानकर हैरान और निराश होते हैं। दिनांक / समय शाब्दिक की अनुपस्थिति के लिए सरल विवरण (सांत्वना या नहीं) यह है कि जावास्क्रिप्ट में कभी भी एक नहीं था: जावास्क्रिप्ट में दिनांक और समय के मूल्यों का समर्थन पूरी तरह से दिनांक ऑब्जेक्ट के माध्यम से प्रदान किया गया है। JSON का उपयोग डेटा फॉर्मेट के रूप में करने वाले अधिकांश एप्लिकेशन, इसलिए, आमतौर पर दिनांक या समय मानों को व्यक्त करने के लिए एक स्ट्रिंग या संख्या का उपयोग करते हैं। यदि एक स्ट्रिंग का उपयोग किया जाता है, तो आप आमतौर पर आईएसओ 8601 प्रारूप में होने की उम्मीद कर सकते हैं। यदि किसी संख्या का उपयोग इसके बजाय किया जाता है, तो आमतौर पर युग के बाद से यूनिवर्सल कोऑर्डिनेटेड टाइम (UTC) में मिलीसेकंड की संख्या का अर्थ लिया जाता है, जहाँ 1 जनवरी, 1970 (UTC) को आधी रात के रूप में परिभाषित किया गया है। फिर, यह एक मात्र सम्मेलन है और JSON मानक का हिस्सा नहीं है। यदि आप किसी अन्य एप्लिकेशन के साथ डेटा का आदान-प्रदान कर रहे हैं, तो आपको यह देखने के लिए उसके प्रलेखन की जांच करने की आवश्यकता होगी कि यह JSON पैनल के भीतर दिनांक और समय मान को कैसे एन्कोड करता है। उदाहरण के लिए, Microsoft के ASP.NET AJAX न तो वर्णित सम्मेलनों का उपयोग करता है। इसके बजाय, यह .NET डेटाइम मानों को JSON स्ट्रिंग के रूप में एन्कोड करता है, जहां स्ट्रिंग की सामग्री / दिनांक (टिक्स) / होती है और जहां टिक्कस युग (UTC) के बाद से मिलीसेकंड का प्रतिनिधित्व करता है। यूटीसी में 29 नवंबर, 1989, 4:55:30 पूर्वाह्न को "/ / दिनांक (628318530718) \ /" के रूप में एन्कोड किया गया है। NET AJAX न तो वर्णित सम्मेलनों का उपयोग करता है। इसके बजाय, यह .NET डेटाइम मानों को JSON स्ट्रिंग के रूप में एन्कोड करता है, जहां स्ट्रिंग की सामग्री / दिनांक (टिक्स) / होती है और जहां टिक्कस युग (UTC) के बाद से मिलीसेकंड का प्रतिनिधित्व करता है। यूटीसी में 29 नवंबर, 1989, 4:55:30 पूर्वाह्न को "/ / दिनांक (628318530718) \ /" के रूप में एन्कोड किया गया है। NET AJAX न तो वर्णित सम्मेलनों का उपयोग करता है। इसके बजाय, यह .NET डेटाइम मानों को JSON स्ट्रिंग के रूप में एन्कोड करता है, जहां स्ट्रिंग की सामग्री / दिनांक (टिक्स) / होती है और जहां टिक्कस युग (UTC) के बाद से मिलीसेकंड का प्रतिनिधित्व करता है। यूटीसी में 29 नवंबर, 1989, 4:55:30 पूर्वाह्न को "/ / दिनांक (628318530718) \ /" के रूप में एन्कोड किया गया है।

एक समाधान बस इसे पार्स करना होगा:

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

हालांकि मैंने सुना है कि सिंटेक्स के DateTimeसाथ ऑब्जेक्ट्स को आउटपुट करने के लिए धारावाहिक प्राप्त करने के लिए कहीं न कहीं एक सेटिंग है new Date(xxx)। मैं इसे खोदने की कोशिश करूंगा।


दूसरा पैरामीटर JSON.parse()एक reviverफ़ंक्शन को स्वीकार करता है, जहां यह निर्धारित करता है कि मूल रूप से कैसे मूल्य का उत्पादन किया जाता है, लौटने से पहले।

यहाँ तारीख के लिए एक उदाहरण है:

var parsed = JSON.parse(data, function(key, value) {
  if (typeof value === 'string') {
    var d = /\/Date\((\d*)\)\//.exec(value);
    return (d) ? new Date(+d[1]) : value;
  }
  return value;
});

JSON.parse () के डॉक्स देखें


1
धन्यवाद, हालांकि पार्सिंग कहाँ जाएगा?
जॉन आर्कवे

मैंने जो कोड पोस्ट किया है वह जावास्क्रिप्ट है। आप इसे अपने ग्राहक कोड में डालेंगे।
जेपीओट

6
आप js को नई तारीख (parseInt (dateString.replace (/ \ / Date \ _ \ _ \ _) \ // gi, "$ 1")) तक
छोटा कर सकते हैं

6
वास्तव में रेगेक्स प्रतिस्थापित के रूप में अधिक सही है (/ \ / दिनांक \ (-? \ _ + डी) \ // \ / जी, "$ 1") चूंकि तिथि को एक -ve संख्या के रूप में भी दर्शाया जा सकता है
डॉकी

1
@ हर्षिलशाह के लिए यह दूसरा तर्क है parseInt()। यह फ़ंक्शन को आधार 10 अंक प्रणाली में पूर्णांक निकालने के लिए कहता है। यह एक मूलांक है। यदि आप 8वहाँ डालते हैं, तो यह एक अष्टक संख्या निकालेगा।
एनालॉग वेपन

99

यहाँ जावास्क्रिप्ट में मेरा समाधान है - जेपीोट की तरह बहुत, लेकिन कम (और संभवतः थोड़ा तेज):

value = new Date(parseInt(value.substr(6)));

"value.substr (6)" / दिनांक ("भाग) को निकालता है, और parseInt फ़ंक्शन अंत में आने वाले गैर-संख्या वर्णों को अनदेखा करता है।

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

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

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

1
+1 मैंने आपका सरल समाधान निकाला और इसे एक पुनरावर्ती कार्य में लगाया। यहां देखें: danielsadvt.info/dotnetdatetime
विवियन रिवर

7
ParseInt का उपयोग करते समय आपको हमेशा एक मूलांक निर्दिष्ट करना चाहिए। [स्रोत]: developer.mozilla.org/en-US/docs/JavaScript/Reference/…
जॉन ज़ब्रोस्की

6
@ जॉन्ज़ाब्रोस्की: हर नियम के अपने अपवाद होते हैं। .NET तिथि क्रमांक अग्रणी शून्य के साथ पूर्णांक कभी नहीं देता है, इसलिए हम सुरक्षित रूप से मूलांक को छोड़ सकते हैं।
रॉय टिंकर

4
हमारे पास लगभग यही बात थी। हमने value.substr(6, 13)अन्य गैर-संख्या वर्णों को निकालने के लिए उपयोग किया । लेकिन अगर आप ऐसा करते हैं, तो सभी तारीखें 04/26/1938 से पहले अमान्य हैं! हमें नहीं पता था parseIntकि गैर-संख्या वर्णों को अनदेखा किया जाएगा। धन्यवाद!
राल्फ जिनसेन

2
@ JohnZabroski- parseIntको ECMAScript एड 5 (2011) के रूप में अग्रणी शून्य को अनदेखा करना चाहिए ।
रॉबिज

69

ग्राहक पक्ष को संभालने के लिए काफी जवाब हैं, लेकिन यदि आप चाहें तो आउटपुट सर्वर पक्ष को बदल सकते हैं।

इस दृष्टिकोण के लिए कुछ तरीके हैं, मैं मूल बातें शुरू करूँगा। आपको JsonResult वर्ग को उप-वर्ग करना होगा और ExecuteResult विधि को ओवरराइड करना होगा। वहाँ से आप क्रमांकन को बदलने के लिए कुछ अलग तरीके अपना सकते हैं।

दृष्टिकोण 1: डिफ़ॉल्ट कार्यान्वयन JsonScriptSerializer का उपयोग करता है । यदि आप प्रलेखन पर एक नज़र डालते हैं, तो आप कस्टम JavaScriptConverters जोड़ने के लिए RegisterConverters पद्धति का उपयोग कर सकते हैं । हालांकि इसके साथ कुछ समस्याएं हैं: JavaScriptConverter एक शब्दकोश में अनुक्रमित करता है, अर्थात यह एक वस्तु लेता है और एक Json शब्दकोश में अनुक्रमित करता है। किसी स्ट्रिंग को ऑब्जेक्ट को क्रमबद्ध बनाने के लिए उसे थोड़ी सी हैकरी की आवश्यकता होती है, पोस्ट देखें । यह विशेष हैक भी स्ट्रिंग से बच जाएगा।

public class CustomJsonResult : JsonResult
{
    private const string _dateFormat = "yyyy-MM-dd HH:mm:ss";

    public override void ExecuteResult(ControllerContext context)
    {
        if (context == null)
        {
            throw new ArgumentNullException("context");
        }

        HttpResponseBase response = context.HttpContext.Response;

        if (!String.IsNullOrEmpty(ContentType))
        {
            response.ContentType = ContentType;
        }
        else
        {
            response.ContentType = "application/json";
        }
        if (ContentEncoding != null)
        {
            response.ContentEncoding = ContentEncoding;
        }
        if (Data != null)
        {
            JavaScriptSerializer serializer = new JavaScriptSerializer();

            // Use your custom JavaScriptConverter subclass here.
            serializer.RegisterConverters(new JavascriptConverter[] { new CustomConverter });

            response.Write(serializer.Serialize(Data));
        }
    }
}

दृष्टिकोण 2 (अनुशंसित): दूसरा तरीका ओवरराइड किए गए JsonResult से शुरू करना है और मेरे मामले में Json.NET के अन्य धारावाहिक के साथ जाना है । यह दृष्टिकोण की हैकरी की आवश्यकता नहीं है। यहाँ मेरे JsonResult उपवर्ग का कार्यान्वयन है:

public class CustomJsonResult : JsonResult
{
    private const string _dateFormat = "yyyy-MM-dd HH:mm:ss";

    public override void ExecuteResult(ControllerContext context)
    {
        if (context == null)
        {
            throw new ArgumentNullException("context");
        }

        HttpResponseBase response = context.HttpContext.Response;

        if (!String.IsNullOrEmpty(ContentType))
        {
            response.ContentType = ContentType;
        }
        else
        {
            response.ContentType = "application/json";
        }
        if (ContentEncoding != null)
        {
            response.ContentEncoding = ContentEncoding;
        }
        if (Data != null)
        {
            // Using Json.NET serializer
            var isoConvert = new IsoDateTimeConverter();
            isoConvert.DateTimeFormat = _dateFormat;
            response.Write(JsonConvert.SerializeObject(Data, isoConvert));
        }
    }
}

उपयोग उदाहरण:

[HttpGet]
public ActionResult Index() {
    return new CustomJsonResult { Data = new { users=db.Users.ToList(); } };
}

अतिरिक्त क्रेडिट: जेम्स न्यूटन-किंग


और दूसरों के बारे में क्या मौद्रिक, पहचान संख्या, टेलीफोन, और इतने पर प्रारूप? ModelMetadata से इन प्रारूपों को प्राप्त करने और मॉडल का उपयोग करके Json में क्रमबद्ध करने के लिए बेहतर aproach नहीं होना चाहिए? कैसे ?
लुसियानो

1
यह सबसे अच्छा समाधान है (पेरिशेबल डेव का जवाब)। सर्वर सही तिथि प्रारूप देने के लिए जिम्मेदार है। इसके अलावा एक कस्टम JsonResult होने से कई और लाभ और नियंत्रण मिलते हैं। मैं एक सहायक विधि "CustomJson (डेटा)" को लागू करने का सुझाव दूंगा जो कि CustomJsonResult को तत्काल रूप में प्रस्तुत करता है क्योंकि "Json (डेटा)" मौजूद है, जो अपने डेटा के साथ JsonResult को तुरंत तैयार करता है।
स्पोर्ट्स

2
एक सुधार की आवश्यकता है यदि आप इन तरीकों में से किसी एक का उपयोग करते हैं - पहली पंक्ति होनी चाहिए: निजी कास्ट स्ट्रिंग _dateFormat = "yyyy-MM-ddTHH: mm: ss"; मैंने "T" जोड़ा।
डोमिनिक

31

Moment.js एक व्यापक डेटाटाइम लाइब्रेरी है जो इसका समर्थन भी करती है। http://momentjs.com/docs/#/parsing/asp-net-json-dates/

उदा: क्षण ("/ तिथि (1198908717056-0700) /")

यह मदद कर सकता है। प्लंकर उत्पादन


पहले डाउनलोड क्षण.जज फ़ाइल। अपनी परियोजना में जोड़ें उपयोग से moment("json_date_string_value").format('appropriate format'); आप momet.js पृष्ठ पर विभिन्न प्रारूप मान देख सकते हैं
हर्षिल शाह

20

मैंने पाया कि एक नया बनाने JsonResultअसंतोषजनक है और वह लौट - सभी कॉल को बदलने के लिए होने return Json(obj)के साथ return new MyJsonResult { Data = obj }एक दर्द है।


तो मुझे लगा, क्यों न सिर्फ JsonResultएक का उपयोग कर अपहरण ActionFilter:

public class JsonNetFilterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        if (filterContext.Result is JsonResult == false)
        {
            return;
        }

        filterContext.Result = new JsonNetResult(
            (JsonResult)filterContext.Result);
    }

    private class JsonNetResult : JsonResult
    {
        public JsonNetResult(JsonResult jsonResult)
        {
            this.ContentEncoding = jsonResult.ContentEncoding;
            this.ContentType = jsonResult.ContentType;
            this.Data = jsonResult.Data;
            this.JsonRequestBehavior = jsonResult.JsonRequestBehavior;
            this.MaxJsonLength = jsonResult.MaxJsonLength;
            this.RecursionLimit = jsonResult.RecursionLimit;
        }

        public override void ExecuteResult(ControllerContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }

            var isMethodGet = string.Equals(
                context.HttpContext.Request.HttpMethod, 
                "GET", 
                StringComparison.OrdinalIgnoreCase);

            if (this.JsonRequestBehavior == JsonRequestBehavior.DenyGet
                && isMethodGet)
            {
                throw new InvalidOperationException(
                    "GET not allowed! Change JsonRequestBehavior to AllowGet.");
            }

            var response = context.HttpContext.Response;

            response.ContentType = string.IsNullOrEmpty(this.ContentType) 
                ? "application/json" 
                : this.ContentType;

            if (this.ContentEncoding != null)
            {
                response.ContentEncoding = this.ContentEncoding;
            }

            if (this.Data != null)
            {
                response.Write(JsonConvert.SerializeObject(this.Data));
            }
        }
    }
}

इसके JsonResultबजाय JSON.Net का उपयोग करने के लिए लौटने वाली किसी भी विधि पर लागू किया जा सकता है :

[JsonNetFilter]
public ActionResult GetJson()
{
    return Json(new { hello = new Date(2015, 03, 09) }, JsonRequestBehavior.AllowGet)
}

जिसके साथ प्रतिक्रिया होगी

{"hello":"2015-03-09T00:00:00+00:00"}

जैसी इच्छा!


यदि आप isहर अनुरोध पर तुलना करने का मन नहीं करते हैं, तो आप इसे अपने साथ जोड़ सकते हैं FilterConfig:

// ...
filters.Add(new JsonNetFilterAttribute());

और आपके सभी JSON को अब बिल्ट-इन के बजाय JSON.Net के साथ क्रमबद्ध किया जाएगा JavaScriptSerializer


यह केवल एक ही उत्तर है जो अजीब जावास्क्रिप्ट इनलाइन के बिना एक ठोस दृष्टिकोण (वैश्विक या दानेदार के रूप में सेट किया जा सकता है) प्रदान करता है। क्या मैं दो बार उत्थान कर सकता हूं?
टी-मोटिव

19

के साथ ऑटो कन्वर्ट करने के लिए jQuery का उपयोग करना $.parseJSON

नोट : यह उत्तर एक jQuery एक्सटेंशन प्रदान करता है जो स्वचालित ISO और .net दिनांक स्वरूप समर्थन जोड़ता है।

चूंकि आप Asp.net MVC का उपयोग कर रहे हैं, मुझे संदेह है कि आप क्लाइंट पक्ष पर jQuery का उपयोग कर रहे हैं। मेरा सुझाव है कि आप इस ब्लॉग पोस्ट को पढ़ें जिसमें कोड है कि कैसे $.parseJSONआप के लिए स्वचालित रूप से दिनांक बदलने के लिए उपयोग करें।

कोड Asp.net स्वरूपित तारीखों का समर्थन करता है, जैसे कि आपने जो उल्लेख किया है वह आईएसओ प्रारूपित तारीखें हैं। सभी तिथियों का उपयोग करके स्वचालित रूप से आपके लिए स्वरूपित किया जाएगा $.parseJSON()


2
पहले तो मुझे लगा कि इस दृष्टिकोण ने बहुत अच्छा काम किया है। ($ .AjaxSetup () में कन्वर्टर को रजिस्टर करने के लिए लेख के अंत में टिप्पणियां देखें। हालांकि, इस समाधान का एक बड़ा पहलू यह है कि यह एपोक (1970) से पहले की तारीखों का समर्थन नहीं करता है ..... इसलिए अब मैंने इसे केवल .asmx फ़ाइलों को छोड़ने और WebAPI पर स्विच करने का निर्णय लिया गया है, जो प्रारूपों को बेहतर बनाता है (JSON.NET का उपयोग करके) और सभी परेशानी को कम करेगा।
क्लीयरक्लाउड 8

11

क्लाइंट और सर्वर के बीच अजाक्स संचार में अक्सर JSON प्रारूप में डेटा शामिल होता है। जबकि JSON स्ट्रिंग्स, संख्याओं और बूलियन के लिए अच्छी तरह से काम करता है, यह ASP.NET को उनके द्वारा अनुक्रमित करने के तरीके के कारण तारीखों के लिए कुछ कठिनाइयों का कारण बन सकता है। चूंकि इसमें तिथियों के लिए कोई विशेष प्रतिनिधित्व नहीं है, उन्हें सादे तार के रूप में क्रमबद्ध किया जाता है। एक समाधान के रूप में ASP.NET वेब फॉर्म और MVC के डिफ़ॉल्ट क्रमांकन तंत्र एक विशेष रूप - / दिनांक (टिक) / - जहां टिक 1 मिली 1970 की मिलीसेकंड की संख्या है, में दिनांक को क्रमबद्ध करता है।

इस समस्या को 2 तरीकों से हल किया जा सकता है:

ग्राहक की ओर

प्राप्त दिनांक स्ट्रिंग को एक संख्या में परिवर्तित करें और दिनांक श्रेणी का निर्माण करने वाले का उपयोग करके दिनांक ऑब्जेक्ट को पैरामीटर के रूप में टिक के साथ बनाएं।

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

सर्वर साइड

पिछले समाधान एक क्लाइंट साइड स्क्रिप्ट का उपयोग करके तारीख को जावास्क्रिप्ट तिथि ऑब्जेक्ट में परिवर्तित करता है। आप सर्वर साइड कोड का भी उपयोग कर सकते हैं जो आपकी पसंद के प्रारूप में .NET डेटटाइम इंस्टेंस को क्रमबद्ध करता है। इस कार्य को पूरा करने के लिए आपको अपना ActionResult बनाने की आवश्यकता है और फिर डेटा को उस तरह से क्रमबद्ध करें जैसा आप चाहते हैं।

संदर्भ: http://www.developer.com/net/dealing-with-json-dates-in-asp.net-mvc.html


7

मेरे पास एक ही समस्या थी और इसके बजाय मैंने वास्तविक तारीख मूल्य को वापस करने के लिए इस्तेमाल किया था, इसके लिए केवल ToString ("dd MMM yyyy")। तब मेरी जावास्क्रिप्ट में मैंने नई तारीख (तारीख) का उपयोग किया, जहां दिनांक "01 जनवरी 2009" हो सकता है।


1
यह बहुत अधिक upvotes होना चाहिए। यह कम से कम उतना ही अच्छा है जितना सबसे ऊपर चढ़ा हुआ। तार काटने से थोड़ा अधिक सुरुचिपूर्ण। व्यक्तिगत रूप से, मैंने इसका उपयोग किया लेकिन सामने के छोर पर दिनांक ऑब्जेक्ट को दोबारा नहीं बनाया क्योंकि मुझे इसे प्रदर्शित करने की आवश्यकता थी, इसलिए मैंने बस (थोड़ा अलग) स्वरूपित स्ट्रिंग प्रदर्शित किया। टिप के लिए धन्यवाद, @ जो!
vbullinger 14

1
यह चिंताओं के पृथक्करण को तोड़ता है, अर्थात इस चिंता का विषय है कि पीछे के छोर पर सामने के छोर पर तारीख कैसे दिखाई जाती है। लेकिन meh, यह अभी भी अधिक सुंदर है।
ए मुरै

1
क्यों नहीं कुछ कम नाजुक का उपयोग करें, जैसे ToString("o")?
बिंकी

"dd MMM yyyy" ECMA-262 द्वारा समर्थित नहीं है, इसलिए आपको इसे पार्स करने के लिए बिल्ट-इन पार्सर की उम्मीद नहीं करनी चाहिए
RobG

3

देखें यह धागा:

http://forums.asp.net/p/1038457/1441866.aspx#1441866

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


आपको लगता है कि "नई तिथि () प्रारूप मान्य जावास्क्रिप्ट है" ["नए" कीवर्ड पर ध्यान दें]?
जेपीओट

2

नहीं सबसे सुंदर तरीका है, लेकिन यह मेरे लिए काम किया:

var ms = date.substring(6, date.length - 2);
var newDate = formatDate(ms);


function formatDate(ms) {

    var date = new Date(parseInt(ms));
    var hour = date.getHours();
    var mins = date.getMinutes() + '';
    var time = "AM";

    // find time 
    if (hour >= 12) {
        time = "PM";
    }
    // fix hours format
    if (hour > 12) {
        hour -= 12;
    }
    else if (hour == 0) {
        hour = 12;
    }
    // fix minutes format
    if (mins.length == 1) {
        mins = "0" + mins;
    }
    // return formatted date time string
    return date.getMonth() + 1 + "/" + date.getDate() + "/" + date.getFullYear() + " " + hour + ":" + mins + " " + time;
}

2

मैं इस मुद्दे के समाधान पर काम कर रहा हूं क्योंकि उपरोक्त किसी भी उत्तर ने वास्तव में मेरी मदद नहीं की। मैं jquery सप्ताह के कैलेंडर के साथ काम कर रहा हूं और सर्वर पर और स्थानीय रूप से पृष्ठ पर समय क्षेत्र की जानकारी के लिए मेरी तिथियों की आवश्यकता है। आसपास काफी खुदाई करने के बाद, मैंने एक समाधान निकाला जो दूसरों की मदद कर सकता है।

मैं asp.net 3.5, बनाम 2008, asp.net MVC 2 और jquery सप्ताह कैलेंडर का उपयोग कर रहा हूं,

सबसे पहले, मैं स्टीवन लेविथान द्वारा लिखी गई एक लाइब्रेरी का उपयोग कर रहा हूं जो क्लाइंट साइड, स्टीवन लेविथ की दूसरी लाइब्रेरी में तारीखों से निपटने में मदद करती है। । IsoUtcDateTime का प्रारूप मेरे लिए आवश्यक है। मेरे jquery AJAX कॉल में मैं isoUtcDateTime प्रारूप के साथ पुस्तकालय के साथ प्रदान किए गए प्रारूप फ़ंक्शन का उपयोग करता हूं और जब ajax कॉल मेरी क्रिया विधि को हिट करता है, तो डेटाइम काइंड स्थानीय पर सेट होता है और सर्वर समय को दर्शाता है।

जब मैं AJAX के माध्यम से अपने पृष्ठ पर तारीखें भेजता हूं, तो मैं उन्हें "ddd, dd MMM yyyy HH ':' mm ':' ss 'GMT'zzzz" का उपयोग करके तिथियों को पाठ स्ट्रिंग के रूप में भेजता हूं। इस प्रारूप को आसानी से परिवर्तित ग्राहक पक्ष का उपयोग कर रहा है

var myDate = new Date(myReceivedDate);

यहाँ मेरा पूरा समाधान माइनस स्टीव लेविथान का स्रोत है, जिसे आप डाउनलोड कर सकते हैं:

नियंत्रक:

public class HomeController : Controller
{
    public const string DATE_FORMAT = "ddd, dd MMM yyyy HH':'mm':'ss 'GMT'zzzz";

    public ActionResult Index()
    {
        ViewData["Message"] = "Welcome to ASP.NET MVC!";

        return View();
    }

    public ActionResult About()
    {
        return View();
    }


    public JsonResult GetData()
    {
        DateTime myDate = DateTime.Now.ToLocalTime();

        return new JsonResult { Data = new { myDate = myDate.ToString(DATE_FORMAT) } };
    }

    public JsonResult ReceiveData(DateTime myDate)
    {
        return new JsonResult { Data = new { myDate = myDate.ToString(DATE_FORMAT) } };
    }
}

जावास्क्रिप्ट:

<script type="text/javascript">

function getData() {
    $.ajax({
        url: "/Home/GetData",
        type: "POST",
        cache: "false",
        dataType: "json",
        success: function(data) {
            alert(data.myDate);
            var newDate = cleanDate(data.myDate);
            alert(newDate);
            sendData(newDate);
        }
    });
} 

function cleanDate(d) {
    if (typeof d == 'string') {
        return new Date(d) || Date.parse(d) || new Date(parseInt(d));
    }
    if (typeof d == 'number') {
        return new Date(d);
    }
    return d;
}

function sendData(newDate) {
    $.ajax({
        url: "/Home/ReceiveData",
        type: "POST",
        cache: "false",
        dataType: "json",
        data:
        {
            myDate: newDate.format("isoUtcDateTime")
        },
        success: function(data) {
            alert(data.myDate);
            var newDate = cleanDate(data.myDate);
            alert(newDate);
        }
    });
}

// bind myButton click event to call getData
$(document).ready(function() {
    $('input#myButton').bind('click', getData);
});
</script>

मुझे आशा है कि यह त्वरित उदाहरण दूसरों को उसी स्थिति में बाहर निकालने में मदद करता है जिस स्थिति में मैं था। इस समय यह Microsoft JSON Serialization के साथ बहुत अच्छी तरह से काम करता है और मेरी तिथियों को टाइमज़ोन में सही रखता है।


यदि आप तिथि के प्रारूप को निर्दिष्ट कर सकते हैं, तो आपको आईएसओ 8601 का उपयोग करना चाहिए, क्योंकि ईसीएमए -262 के लिए केवल एक ही प्रारूप आवश्यक है।
रॉबजी

2

नॉकआउट में तारीखों को संभालने का बेहतर तरीका है कि आप लाइब्रेरी की तरह और बॉस की तरह तारीखों को संभालें। आप आसानी से तारीखों / तारीखों (-62135578800000) / के साथ सौदा कर सकते हैं। नियंत्रक में आपकी क्रमिक तिथि कैसे होती है, इसे परेशान करने की आवश्यकता नहीं है।

function jsonToDate(date,format) {
   return moment(date).format(format);
}

इसका उपयोग करें

var formattedDate = jsonToDate(date,'MM/DD/YYYY')

मोमेंट्स डेट्स पर बहुत सारे डेट टाइम फॉर्मेट्स और यूटिलिटी फंक्शन सपोर्ट करता है।


1

क्वेरी के भीतर दिनांक को प्रारूपित करें।

var _myModel = from _m in model.ModelSearch(word)
    select new { date = ((DateTime)_m.Date).ToShortDateString() };

इस समाधान के साथ एकमात्र समस्या यह है कि किसी भी तारीख मान शून्य होने पर आपको कोई परिणाम नहीं मिलेगा। इसके आस-पास पाने के लिए आप या तो अपनी क्वेरी में सशर्त विवरण डाल सकते हैं इससे पहले कि आप उस तारीख का चयन करें जो तिथि नल को अनदेखा करता है या आप सभी परिणामों को प्राप्त करने के लिए एक क्वेरी सेट कर सकते हैं और फिर उस फ़ॉरेस्ट लूप का उपयोग करते हुए सभी जानकारी के माध्यम से लूप कर सकते हैं और एक मान निर्दिष्ट कर सकते हैं उन सभी तिथियों के लिए जो पहले से ही शून्य हैं आप अपना नया चयन करते हैं।

दोनों का उदाहरण:

var _test = from _t in adc.ItemSearchTest(word)
                        where _t.Date != null
                        select new { date = ((DateTime)_t.Date).ToShortDateString() };

दूसरे विकल्प के लिए पूरी तरह से एक और क्वेरी की आवश्यकता है ताकि आप सभी नल को मान प्रदान कर सकें। यह और फॉरेस्ट लूप आपकी क्वेरी से पहले होना चाहिए जो मानों का चयन करता है।

var _testA = from _t in adc.ItemSearchTest(word)
                         select _i;

            foreach (var detail in _testA)
            {
                if (detail.Date== null)
                {
                    detail.Date= Convert.ToDateTime("1/1/0001");
                }
            }

बस एक विचार जो मुझे जावास्क्रिप्ट के सभी उदाहरणों से आसान लगा।


1

आप इस विधि का उपयोग कर सकते हैं:

String.prototype.jsonToDate = function(){
    try{
        var date;
        eval(("date = new " + this).replace(/\//g,''));
        return date;
    } 
    catch(e){
        return new Date(0);
    }
};

1

0

अपने cshtml में,

<tr ng-repeat="value in Results">                
 <td>{{value.FileReceivedOn | mydate | date : 'dd-MM-yyyy'}} </td>
</tr>

आपकी JS फ़ाइल में, शायद app.js,

App.controller के बाहर, नीचे फिल्टर जोड़ें।

यहां "mydate" वह फ़ंक्शन है जिसे आप डेट पार्स करने के लिए कह रहे हैं। यहां "ऐप" वैरिएबल है जिसमें एंगुलर.module होता है

app.filter("mydate", function () {
    var re = /\/Date\(([0-9]*)\)\//;
    return function (x) {
        var m = x.match(re);
        if (m) return new Date(parseInt(m[1]));
        else return null;
    };
});

यह एंगुलरज के लिए बहुत विशिष्ट है, सभी लोग इसका उपयोग नहीं करते हैं, लेकिन इसने मेरे लिए काम किया, धन्यवाद।
लौरो 182

0

अपने पेज में jquery ui प्लगइन जोड़ें।

function JsonDateFormate(dateFormate, jsonDateTime) {
    return $.datepicker.formatDate(dateFormate, eval('new ' + jsonDateTime.slice(1, -1)));
};

0

कुछ नहीं के लिए नहीं, लेकिन एक और तरीका है। सबसे पहले, अपने LINQ क्वेरी का निर्माण करें। फिर, एनुमरेटेड परिणाम की एक क्वेरी का निर्माण करें और जो भी प्रकार का स्वरूपण आपके लिए काम करता है उसे लागू करें।

var query = from t in db.Table select new { t.DateField };
var result = from c in query.AsEnumerable() select new { c.DateField.toString("dd MMM yyy") };

मुझे कहना है, अतिरिक्त कदम कष्टप्रद है, लेकिन यह अच्छी तरह से काम करता है।


0

मेरे लिए जो काम किया गया वह एक व्यूह्मॉडल बनाने के लिए था जिसमें तारीख संपत्ति को एक स्ट्रिंग के रूप में समाहित किया गया था। डोमेन मॉडल से दिनांक समय गुण को असाइन करना और दृश्यमॉडल को मान निर्दिष्ट करते हुए दिनांक संपत्ति पर .ToString () कॉल करना।

MVC एक्शन विधि से JSON परिणाम, दृश्य के साथ संगत प्रारूप में दिनांक लौटाएगा।

मॉडल देखें

public class TransactionsViewModel
{
    public string DateInitiated { get; set; }
    public string DateCompleted { get; set; }
}

डोमेन मॉडल

public class Transaction{
   public DateTime? DateInitiated {get; set;}
   public DateTime? DateCompleted {get; set;}
}

नियंत्रक क्रिया विधि

public JsonResult GetTransactions(){

var transactions = _transactionsRepository.All;
        var model = new List<TransactionsViewModel>();

        foreach (var transaction in transactions)
        {
            var item = new TransactionsViewModel
            {
                ...............
                DateInitiated = transaction.DateInitiated.ToString(),
                DateCompleted = transaction.DateCompleted.ToString(),
            };

            model.Add(item);
        }
        return Json(model, JsonRequestBehavior.AllowGet);
}


0

कष्टप्रद, है ना?

मेरा समाधान मेरी WCF सेवा को बदलने के लिए था ताकि डेटटेम्स को अधिक पठनीय (गैर-Microsoft) प्रारूप में वापस लाया जा सके। नीचे दी गई सूचना, " UpdateDateOriginal", जो तारीखों का डब्ल्यूसीएफ का डिफ़ॉल्ट प्रारूप है, और मेरा " UpdateDate", जो कि पढ़ने योग्य कुछ के लिए स्वरूपित है।

यहां छवि विवरण दर्ज करें

यह कैसे करना है:

WCF तिथि प्रारूप बदलना

उम्मीद है की यह मदद करेगा।


0

मैंने इसे सर्वर साइड में बदलने का सबसे आसान तरीका पाया।

using System.Collections.Generic;
using System.Web.Mvc;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Serialization;

namespace Website
{
    /// <summary>
    /// This is like MVC5's JsonResult but it uses CamelCase and date formatting.
    /// </summary>
    public class MyJsonResult : ContentResult
    {
        private static readonly JsonSerializerSettings Settings = new JsonSerializerSettings
        {
            ContractResolver = new CamelCasePropertyNamesContractResolver(),
            Converters = new List<JsonConverter> { new StringEnumConverter() }
        };

        public FindersJsonResult(object obj)
        {
            this.Content = JsonConvert.SerializeObject(obj, Settings);
            this.ContentType = "application/json";
        }
    }
}

0

मेरे पास JSON तिथियों के साथ कई मुद्दे आए और SQL में दिनांक समस्या को संबोधित करके समस्या से छुटकारा पाने का निर्णय लिया। दिनांक स्वरूप को एक स्ट्रिंग प्रारूप में बदलें

select flddate from tblName

select flddate, convert(varchar(12), flddate, 113) as fldDateStr from tblName

FldDateStr का उपयोग करने से यह समस्या समाप्त हो गई और मैं अभी भी दिनांक फ़ील्ड का उपयोग छँटाई या अन्य उद्देश्यों के लिए कर सकता था।


0

यह सर्वर दिनांक स्वरूप लौटाता है। आपको अपने स्वयं के फ़ंक्शन को परिभाषित करने की आवश्यकता है।

function jsonDateFormat(jsonDate) {
  // Changed data format;
  return (new Date(parseInt(jsonDate.substr(6)))).format("mm-dd-yyyy / h:MM tt");
};

0

यहां कुछ जावास्क्रिप्ट कोड मैंने लिखे हैं जो <input type="date">ASP.NET MVC से पारित तिथि से एक मान सेट करते हैं ।

var setDate = function(id, d) {
  if (d !== undefined && d !== null) {
    var date = new Date(parseInt(d.replace("/Date(", "").replace(")/", ""), 10));
    var day = ('0' + date.getDate()).slice(-2);
    var month = ('0' + (date.getMonth() + 1)).slice(-2);
    var parsedDate = date.getFullYear() + "-" + (month) + "-" + (day);
    $(id).val(parsedDate);
  }
};

आप इस फ़ंक्शन को ऐसा कहते हैं:

setDate('#productCommissionStartDate', data.commissionStartDate);

commissionStartDateएमवीसी द्वारा पास की गई JSON तिथि कहाँ है?


-1

सबसे आसान एक:

var milisegundos = parseInt (data.replace ("/ Date (", "") .replace (") /", "");
वार newDate = नई तिथि (milisegundos)। toLocaleDateString ("एन-यूई");

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