ASP.NET MVC JsonResult তারিখ ফর্ম্যাট


248

আমার একটি কন্ট্রোলার অ্যাকশন রয়েছে যা কার্যকরভাবে সহজভাবে আমার মডেলের একটি জসনআরসাল্ট ফিরিয়ে দেয়। সুতরাং, আমার পদ্ধতিতে আমার নীচের মতো কিছু রয়েছে:

return new JsonResult(myModel);

এটি একটি সমস্যা বাদে ভাল কাজ করে। মডেলটিতে একটি তারিখের সম্পত্তি রয়েছে এবং এটি জসনের ফলাফলটিতে ফিরে আসে বলে মনে হয়:

"\/Date(1239018869048)\/"

আমি কীভাবে তারিখগুলি নিয়ে কাজ করব যাতে সেগুলি আমার প্রয়োজনীয় ফর্ম্যাটে ফিরে আসে? বা স্ক্রিপ্টের উপরে আমি কীভাবে এই বিন্যাসটি পরিচালনা করব?


আমি আমার জেসন নেট ফলাফলটি একই সমস্যায় পোস্ট করেছি, এটি তারিখটিকে আইসো ফর্ম্যাটে রূপান্তর করে যা এর সাথে কাজ করা আরও সহজ করে তোলে। stackoverflow.com/questions/15778599/…
কাইরান

নীচের এই লিঙ্কটি দেখুন দয়া করে। স্ট্রেট ফরোয়ার্ড stackoverflow.com/a/60392503/5962626
Mohamedasiq

উত্তর:


195

কেবল ক্যাস্পারওয়ের উত্তরে প্রসারিত করতে ।

তাদেরকে JSON বৈশিষ্ট তারিখ মানের জন্য অ্যাকাউন্ট নেই। এমএসকে একটি কল করতে হয়েছিল, এবং তারা যে পথটি বেছে নিয়েছিল তা ছিল জাভাস্ক্রিপ্টের স্ট্রিংয়ের উপস্থাপনায় কিছু কৌশল অবলম্বন করা: স্ট্রিং আক্ষরিক "/" "\ /" এর সমান এবং স্ট্রিং আক্ষরিক কখনই সিরিয়ালযুক্ত হবে না " । / "(এমনকি" \ / "অবশ্যই ম্যাপ করতে হবে" \\ / ")।

আরও ভাল ব্যাখ্যার জন্য http://msdn.microsoft.com/en-us/library/bb299886.aspx#intro_to_json_topic2 দেখুন ("জাভাস্ক্রিপ্ট লিটারাল থেকে জেএসএন তে" স্ক্রোল করুন)

জেএসএন-এর এক কালশিটে বিষয় হ'ল একটি তারিখ / সময়ের আক্ষরিক অভাব। যখন জেএসএনের প্রথম মুখোমুখি হয়েছিল তখন অনেকেই এটি জানতে পেরে অবাক এবং হতাশ হন। তারিখ / সময় আক্ষরিক অনুপস্থিতির সহজ ব্যাখ্যা (সান্ত্বনা দেওয়া বা না) হ'ল জাভাস্ক্রিপ্টের একটিও ছিল না: জাভাস্ক্রিপ্টে তারিখ এবং সময় মানগুলির জন্য সমর্থন পুরোপুরি তারিখ অবজেক্টের মাধ্যমে সরবরাহ করা হয়। জাসনকে ডেটা ফর্ম্যাট হিসাবে ব্যবহার করে বেশিরভাগ অ্যাপ্লিকেশনগুলির মধ্যে সাধারণত তারিখ এবং সময় মানগুলি প্রকাশ করার জন্য স্ট্রিং বা একটি সংখ্যা ব্যবহার করার ঝোঁক থাকে। যদি কোনও স্ট্রিং ব্যবহার করা হয়, তবে আপনি সাধারণত এটি আইএসও 8601 ফর্ম্যাটে থাকতে পারে বলে আশা করতে পারেন। যদি এর পরিবর্তে কোনও সংখ্যার ব্যবহার করা হয়, তবে মানটি সাধারণত মহাবিদ্যার সমন্বিত সময় (ইউটিসি) -এর মিলিসেকেন্ডগুলির সংখ্যাকে বোঝাতে নেওয়া হয়, যেখানে পর্বটি 1 জানুয়ারী, 1970, (ইউটিসি) মধ্যরাত হিসাবে সংজ্ঞায়িত করা হয়েছিল। আবার, এটি নিছক কনভেনশন এবং জেএসএন স্ট্যান্ডার্ডের অংশ নয়। আপনি যদি অন্য কোনও অ্যাপ্লিকেশনের সাথে ডেটা বিনিময় করছেন, এটি আপনাকে JSON আক্ষরিকের মধ্যে তারিখ এবং সময় মানগুলি কীভাবে এনকোড করে তা দেখতে এটির ডকুমেন্টেশনগুলি পরীক্ষা করতে হবে। উদাহরণস্বরূপ, মাইক্রোসফ্টের এএসপি.নেট এজেএক্স বর্ণিত কনভেনশনগুলির কোনওটিই ব্যবহার করে না। বরং এটি এনকোড করে NET ডেটটাইম মানকে একটি জেএসএন স্ট্রিং হিসাবে, যেখানে স্ট্রিংয়ের বিষয়বস্তুটি / তারিখ (টিক্স) / এবং যেখানে টিক্স যুগের (ইউটিসি) সাল থেকে মিলি সেকেন্ডের প্রতিনিধিত্ব করে। সুতরাং নভেম্বর 29, 1989, 4:55:30 পূর্বাহ্ন, ইউটিসিতে "\ / তারিখ (628318530718) \ /" হিসাবে এনকোড করা আছে নেট আজিক্স বর্ণিত কনভেনশনগুলির কোনওটিই ব্যবহার করে না। বরং এটি এনকোড করে NET ডেটটাইম মানকে একটি জেএসএন স্ট্রিং হিসাবে, যেখানে স্ট্রিংয়ের বিষয়বস্তুটি / তারিখ (টিক্স) / এবং যেখানে টিক্স যুগের (ইউটিসি) সাল থেকে মিলি সেকেন্ডের প্রতিনিধিত্ব করে। সুতরাং নভেম্বর 29, 1989, 4:55:30 পূর্বাহ্ন, ইউটিসিতে "\ / তারিখ (628318530718) \ /" হিসাবে এনকোড করা আছে নেট আজিক্স বর্ণিত কনভেনশনগুলির কোনওটিই ব্যবহার করে না। বরং এটি এনকোড করে NET ডেটটাইম মানকে একটি জেএসএন স্ট্রিং হিসাবে, যেখানে স্ট্রিংয়ের বিষয়বস্তুটি / তারিখ (টিক্স) / এবং যেখানে টিক্স যুগের (ইউটিসি) সাল থেকে মিলি সেকেন্ডের প্রতিনিধিত্ব করে। সুতরাং নভেম্বর 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
আপনি জেএসকে নতুন তারিখ (parseInt (তারিখ স্ট্রিং.রেপ্লেস (/ \ / তারিখ \ ((\ d +) \))) \ // জিআই, "$ 1"))
সংক্ষিপ্ত করতে পারেন

6
যেহেতু তারিখ খুব -ve সংখ্যা হিসাবে প্রতিনিধিত্ব হতে পারে - আসলে Regex হিসেবে প্রতিস্থাপিত (\ D +) \) \ // GI, "$ 1"? / \ / তারিখ \ (() Read সঠিক
Dokie

1
@ হারশিলশাহ এটির পক্ষে দ্বিতীয় যুক্তি parseInt()। এটি ফাংশনটিকে বেস 10 সংখ্যা সিস্টেমে একটি পূর্ণসংখ্যা বের করতে বলে। এটি একটি মূলা। আপনি যদি 8সেখানে রাখেন তবে এটি একটি অষ্টাল নম্বর বের করবে।
অ্যানালগ উইপন

99

জাভাস্ক্রিপ্টে আমার সমাধানটি এখানে দেওয়া হয়েছে - অনেকটা জেপটের মতো তবে সংক্ষিপ্ত (এবং সম্ভবত একটি সামান্য বিট দ্রুত):

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

"মান.সুবস্ট্র (6)" "/ তারিখ (" অংশ) বের করে এবং পার্সেন্ট ফাংশনটি শেষে উপস্থিত নন-সংখ্যা অক্ষরগুলিকে উপেক্ষা করে।

সম্পাদনা: আমি ইচ্ছাকৃতভাবে র‍্যাডিক্সটি ছাড়লাম (পার্সেন্টের দ্বিতীয় তর্ক); দেখতে নীচের আমার মন্তব্য । এছাড়াও, দয়া করে নোট করুন যে ISO-8601 তারিখগুলি এই পুরানো ফর্ম্যাটটির চেয়ে বেশি পছন্দ করা হয় - সুতরাং এই ফর্ম্যাটটি সাধারণত নতুন বিকাশের জন্য ব্যবহার করা উচিত নয়। আইএসও -8601 ফর্ম্যাটটি ব্যবহার করে তারিখগুলিকে সিরিয়ালাইজ করে এমন দুর্দান্ত বিকল্পের জন্য দুর্দান্ত জসন.এনইটি লাইব্রেরি দেখুন ।

আইএসও -8601 ফর্ম্যাটেড জেএসওএন তারিখের জন্য, কেবল তারিখ নির্মাণকারীকে স্ট্রিংটি দিন:

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

1
+1 আমি আপনার সহজ সমাধানটি নিয়েছি এবং এটি পুনরাবৃত্ত ফাংশনে রেখেছি। এখানে দেখুন: danielsadचर.info
ভিভিয়ান নদী

7
পার্সিয়ান্ট ব্যবহার করার সময় আপনার সর্বদা একটি রেডিক্স নির্দিষ্ট করা উচিত। [উত্স]: বিকাশকারী.মোজিলা.আর.ইন
ইউএস / ডকস / জাভা স্ক্রিপ্ট / রেফারেন্স /

6
@ জনজাব্রোস্কি: প্রতিটি নিয়মের ব্যতিক্রম রয়েছে has .NET তারিখ সিরিয়ালাইজার কখনই নেতৃস্থানীয় শূন্যগুলির সাথে পূর্ণসংখ্যার ফেরত দেয় না , তাই আমরা নিরাপদে র‍ডিক্সটি বাইরে রাখতে পারি।
রায় টিঙ্কার

4
আমাদের প্রায় একই জিনিস ছিল। আমরা value.substr(6, 13)অন্যান্য অ-সংখ্যা অক্ষর মুছে ফেলার জন্য ব্যবহার করেছি । তবে আপনি যদি এটি করেন তবে 04/26/1938 এর আগে সমস্ত তারিখগুলি অবৈধ! আমরা জানতাম না যে parseIntঅ-সংখ্যাযুক্ত চরিত্রগুলি উপেক্ষা করবে। ধন্যবাদ!
রাল্ফ জ্যানসেন

2
@ জনজ্যাব্রোস্কি - parseIntএর ECMAScript 5 (2011) হিসাবে শীর্ষস্থানীয় শূন্যগুলি উপেক্ষা করা উচিত ।
রবিজি

69

এটি ক্লায়েন্ট পাশ পরিচালনা করার জন্য বেশ কিছুটা উত্তর রয়েছে, তবে আপনি ইচ্ছা করলে আউটপুট সার্ভারের দিকটি পরিবর্তন করতে পারেন।

এটির কাছে যাওয়ার কয়েকটি উপায় রয়েছে, আমি বেসিকগুলি দিয়ে শুরু করব। আপনাকে জসোনারসাল্ট ক্লাসটি সাবক্লাস করতে হবে এবং এক্সিকিউটর রেজাল্ট পদ্ধতিটি ওভাররাইড করতে হবে। সেখান থেকে সিরিয়ালাইজেশন পরিবর্তন করতে আপনি কয়েকটি পৃথক পন্থা নিতে পারেন।

পদ্ধতির 1: ডিফল্ট বাস্তবায়নটি জসনস্ক্রিপ্টসরিয়ালাইজার ব্যবহার করে । আপনি যদি ডকুমেন্টেশনটি একবার দেখে থাকেন তবে কাস্টম জাভাস্ক্রিপ্ট কনভার্টার যুক্ত করতে আপনি RegisterConverters পদ্ধতিটি ব্যবহার করতে পারেন । যদিও এর সাথে কয়েকটি সমস্যা রয়েছে: জাভাস্ক্রিপ্ট কনভার্টর কোনও অভিধানে সিরিয়ালাইজ করে, এটি হ'ল কোনও বস্তু নিয়ে যায় এবং জাসন অভিধানে সিরিয়ালাইজ করে। স্ট্রিংটিতে অবজেক্টটিকে সিরিয়ালাইজ করার জন্য এর জন্য কিছুটা হ্যাকারি প্রয়োজন, পোস্টটি দেখুন । এই বিশেষ হ্যাক এছাড়াও স্ট্রিং এড়াতে হবে।

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

পদ্ধতির ২ (প্রস্তাবিত): দ্বিতীয় পদ্ধতির বিষয়টি হল ওভাররাইড হওয়া জসনরসাল্ট দিয়ে শুরু করা এবং অন্য জেসন সিরিয়ালাইজারের সাথে আমার ক্ষেত্রে জসন.এনইটি সিরিয়ালাইজারের সাথে যাওয়া। এটিতে পদ্ধতির হ্যাকারি প্রয়োজন হবে না 1 এখানে জাসনআরসাল্ট সাবক্লাসটি আমার বাস্তবায়ন:

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

অতিরিক্ত ক্রেডিট: জেমস নিউটন-কিং


এবং আর্থিক, শনাক্তকরণ নম্বর, টেলিফোন ইত্যাদির মতো অন্য ফর্ম্যাটগুলির কী? মডেলমেটাডেটা থেকে এই ফর্ম্যাটগুলি পাওয়ার জন্য এবং মডেলগুলিকে জসন-এ সিরিয়ালায়িত করতে এগুলি ব্যবহার করার জন্য কি আরও ভাল অভিনবতা নয়? কীভাবে?
লুসিও

1
এটিই সেরা সমাধান (প্যারেশেবল ডেভের উত্তর)। সার্ভার সঠিক তারিখের ফর্ম্যাট দেওয়ার জন্য দায়বদ্ধ। এছাড়াও একটি কাস্টম জসনআরসাল্ট থাকা আরও অনেক সুবিধা এবং নিয়ন্ত্রণ দেয়। আমি একটি সহায়ক পদ্ধতি "কাস্টমজসন (ডেটা)" প্রয়োগের পরামর্শ দেব যা কাস্টমজসনআরসাল্টকে "জসন (ডেটা)" বিদ্যমান বলে তাত্ক্ষণিক করে তোলে যা জেসনআরসাল্টকে তার ডেটা দিয়ে ইনস্ট্যান্ট করে।
ক্রীড়া

2
আপনি যদি এই পদ্ধতির কোনও একটি ব্যবহার করেন তবে একটি সংশোধন প্রয়োজন - প্রথম লাইনটি হওয়া উচিত: ব্যক্তিগত কনস্ট্রিং স্ট্রিং _ডেটফোর্ম্যাট = "yyyy-MM-ddTHH: মিমি: এসএস"; আমি "টি" যুক্ত করেছি।
ডোমিনিক

31

মোমেন্ট.জেস একটি বিস্তৃত ডেটটাইম লাইব্রেরি যা এটি সমর্থন করে। http://momentjs.com/docs/#/parsing/asp-net-json-dates/

উদাঃ মুহূর্ত ("/ তারিখ (1198908717056-0700) /")

এটি সাহায্য করতে পারে। plunker আউটপুট


প্রথম ডাউনলোড moment.js ফাইল। ব্যবহারের চেয়ে আপনার প্রকল্পে যুক্ত করুন আপনি moment("json_date_string_value").format('appropriate format'); মোমেট.জেএস পৃষ্ঠাতে বিভিন্ন ফর্ম্যাট মান দেখতে পারবেন
শাহ

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


এটি কেবলমাত্র একটি উত্তর যা অদ্ভুত জাভাস্ক্রিপ্ট ইনলাইন ছাড়াই একটি দৃ approach় পদ্ধতির (বৈশ্বিক বা দানাদার হিসাবে সেট করা যেতে পারে) সরবরাহ করে। আমি কি দু'বার upvote করতে পারি?
টি-মোটি

19

এর সাথে তারিখগুলি স্বতঃ-রূপান্তর করতে jQuery ব্যবহার করে $.parseJSON

দ্রষ্টব্য : এই উত্তরটি একটি jQuery এক্সটেনশন সরবরাহ করে যা স্বয়ংক্রিয় আইএসও এবং। নেট তারিখ বিন্যাস সমর্থন যোগ করে।

যেহেতু আপনি Asp.net MVC ব্যবহার করছেন আমার সন্দেহ হয় আপনি ক্লায়েন্টের পাশে jQuery ব্যবহার করছেন। আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি এই ব্লগ পোস্টটি পড়েন যাতে কোড রয়েছে $.parseJSONযাতে আপনার জন্য তারিখগুলি স্বয়ংক্রিয়ভাবে রূপান্তর করতে পারে।

কোড যেমন উল্লেখ করেছেন তেমনি আইএসও ফর্ম্যাটেড তারিখগুলির মতো অ্যাসপ নেট ফর্ম্যাট তারিখগুলি সমর্থন করে। সমস্ত তারিখগুলি ব্যবহার করে আপনার জন্য স্বয়ংক্রিয়ভাবে ফর্ম্যাট হবে $.parseJSON()


2
প্রথমে আমি ভেবেছিলাম এই পদ্ধতিটি খুব ভালভাবে কাজ করেছে। (কীভাবে aj .ajaxSetup () এ রূপান্তরকারী নিবন্ধের জন্য নিবন্ধের শেষে মন্তব্যগুলি দেখুন তবে এই সমাধানের একটি বড় ক্ষতি হ'ল এটি এপোকের আগে তারিখগুলি সমর্থন করে না (1970) ..... সুতরাং এখন আমি কেবলমাত্র .asmx ফাইলগুলি ছেড়ে দেওয়ার এবং ওয়েবএপিআই-এ স্যুইচ করার সিদ্ধান্ত নিয়েছে যা ফর্ম্যাটগুলি আরও ভাল তারিখগুলি (JSON.NET ব্যবহার করে) এবং এই সমস্ত সমস্যার সমাধান করবে।
ক্লিয়ারক্লাউড 8

11

ক্লায়েন্ট এবং সার্ভারের মধ্যে অ্যাজাক্স যোগাযোগের সাথে প্রায়শই JSON ফর্ম্যাটে ডেটা যুক্ত থাকে। জেএসএন স্ট্রিং, সংখ্যা এবং বুলিয়ানগুলির জন্য ভালভাবে কাজ করে তবে এটিএসপি নেট নেটরিয়ালিটি প্রয়োগ করার কারণে তারিখগুলির জন্য কিছু অসুবিধা তৈরি করতে পারে। তারিখগুলির জন্য এটির কোনও বিশেষ প্রতিনিধিত্ব না থাকায় এগুলি প্লেইন স্ট্রিং হিসাবে সিরিয়ালযুক্ত করা হয়। সমাধান হিসাবে এএসপি.এনইটি ওয়েব ফর্ম এবং এমভিসি-র ডিফল্ট সিরিয়ালাইজেশন প্রক্রিয়া তারিখগুলিকে একটি বিশেষ আকারে - / তারিখ (টিক্স) / - সিরিজায়িত করে যেখানে টিক্স 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 তারিখটাইম দৃষ্টান্তগুলি ক্রমিক করে তোলে। এই কাজটি সম্পাদন করতে আপনাকে নিজের অ্যাকশনআরসাল্ট তৈরি করতে হবে এবং তারপরে আপনার পছন্দ মতো ডেটা সিরিয়ালাইজ করতে হবে।

তথ্যসূত্র: http://www.developer.com/net/dealing-with-json-dates-in-asp.net-mvc.html


7

আমার একই সমস্যা ছিল এবং আসল তারিখের মানটি পরিবর্তনের পরিবর্তে আমি এটিতে টসস্ট্রিং ("ডিডি এমএমএম ইয়াই") ব্যবহার করেছি। তারপরে আমার জাভাস্ক্রিপ্টে আমি নতুন তারিখ (তারিখের মূল্য) ব্যবহার করেছি, যেখানে তারিখের মান "01 জানু 2009" হতে পারে।


1
এটিতে আরও অনেকগুলি উর্ধ্বমুখী হওয়া উচিত। এটি কমপক্ষে সবচেয়ে উন্নতমানের হিসাবে ভাল। স্ট্রিংস কাটার চেয়ে আরও কিছুটা মার্জিত। ব্যক্তিগতভাবে, আমি এটি ব্যবহার করেছি তবে তারিখের অবজেক্টটি প্রথম প্রান্তে পুনরায় তৈরি করা হয়নি কারণ আমার এটি প্রদর্শন করার দরকার ছিল, তাই আমি (কিছুটা আলাদাভাবে) ফর্ম্যাট স্ট্রিংটি প্রদর্শন করেছি। টিপটির জন্য ধন্যবাদ, জো!
vbullinger

1
এটি উদ্বেগের বিচ্ছেদকে বিরতি দেয়, অর্থাত্ পিছনের প্রান্তে সামনের প্রান্তে কীভাবে একটি তারিখ দেখানো হবে তা উদ্বেগ রেখে। তবে মেহ, এটি আরও মার্জিত।
এ মারে

1
কম ভঙ্গুর কিছু কেন ব্যবহার করবেন না ToString("o")?
বিনকি

"ডিডি এমএমএম ইয়েই" ইসিএমএ-262 দ্বারা সমর্থিত নয়, তাই আপনি বিল্ট-ইন পার্সার এটি বিশ্লেষণের প্রত্যাশা করবেন না
রবজি

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

উপরোক্ত উত্তরগুলির মধ্যে সত্যই আমাকে সহায়তা করেনি বলেই আমি এই সমস্যার সমাধানে কাজ করছি working আমি jquery সপ্তাহের ক্যালেন্ডারের সাথে কাজ করছি এবং সার্ভারে এবং স্থানীয়ভাবে পৃষ্ঠায় সময় অঞ্চল সম্পর্কিত তথ্য পেতে আমার তারিখগুলি প্রয়োজন। বেশ কিছুক্ষন খোঁড়াখুঁড়ি করার পরে, আমি এমন একটি সমাধান বের করেছিলাম যা অন্যকে সাহায্য করতে পারে।

আমি অ্যাসপনেট ৩.৫, বনাম ২০০৮, এসপ নেটওয়্যার এমভিসি ২ এবং জেকারি সপ্তাহের ক্যালেন্ডার ব্যবহার করছি,

প্রথমত, আমি স্টিভেন লেভিথনের লিখিত একটি গ্রন্থাগার ব্যবহার করছি যা ক্লায়েন্টের সাথে তারিখগুলি মোকাবেলায় সহায়তা করে, স্টিভেন লেভিথনের তারিখের লাইব্রেরি । IsoUtcDateTime বিন্যাসটি আমার যা প্রয়োজন তার জন্য উপযুক্ত। আমার jquery AJAX কলটিতে আমি লাইব্রেরিতে isoUtcDateTime বিন্যাসের সাথে প্রদত্ত ফর্ম্যাট ফাংশনটি ব্যবহার করি এবং যখন এজ্যাক্স কলটি আমার অ্যাকশন পদ্ধতিতে আঘাত করে, তখন ডেটটাইম কাইন্ডটি স্থানীয় সেট করা থাকে এবং সার্ভারের সময় প্রতিবিম্বিত হয়।

আমি যখন আমার পৃষ্ঠায় এজেএক্সের মাধ্যমে তারিখগুলি প্রেরণ করি, তখন আমি "ডিডিডি, ডিডি এমএমএম ইয়াই এইচ এইচ": 'মিমি': 'এসএস' জিএমটি'জেজ "ব্যবহার করে তারিখগুলি বিন্যাস করে পাঠ্য স্ট্রিং হিসাবে প্রেরণ করি। এই ফর্ম্যাটটি সহজেই ক্লায়েন্ট সাইড ব্যবহার করে রূপান্তরিত হয়

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

javascript:

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

আমি আশা করি এই দ্রুত উদাহরণটি অন্যদেরকে একই পরিস্থিতিতে যেমন আমার মধ্যে ছিল তেমনভাবে সহায়তা করে। এই মুহুর্তে এটি মাইক্রোসফ্ট জেএসএন সিরিয়ালাইজেশনের সাথে খুব ভালভাবে কাজ করছে বলে মনে হয় এবং সময়সীমা জুড়ে আমার তারিখগুলি সঠিক রাখে।


আপনি যদি তারিখের ফর্ম্যাটটি নির্দিষ্ট করতে পারেন, তবে আপনার ISO 8601 প্রসারিত ব্যবহার করা উচিত কারণ এটি একমাত্র ফর্ম্যাট যার জন্য ইসিএমএ -262 এর জন্য সমর্থন প্রয়োজন।
রবিজি

2

নকআউটজেসগুলিতে তারিখগুলি হ্যান্ডেল করার সর্বোত্তম উপায় হ'ল মুহুর্তের গ্রন্থাগার এবং বসের মতো তারিখগুলি হ্যান্ডেল করা। আপনি / তারিখের মতো তারিখগুলি সহজেই ডিল করতে পারেন (-62135578800000) /। আপনার নিয়ামকটিতে কীভাবে সিরিয়ালাইজ হবে তারিখটি বিরক্ত করার দরকার নেই।

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

এটি পছন্দ করুন

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

momentjs তারিখে প্রচুর তারিখের সময় বিন্যাস এবং ইউটিলিটি ফাংশন সমর্থন করে।


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

আপনার সিএসটিএমএলে,

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

আপনার জেএস ফাইলটিতে, সম্ভবত app.js,

অ্যাপকন্ট্রোলারের বাইরে, নীচের ফিল্টারটি যুক্ত করুন।

এখানে "মায়াডেট" হ'ল ফাংশন যা আপনি তারিখটি বিশ্লেষণের জন্য কল করছেন। এখানে "অ্যাপ্লিকেশন" হ'ল ভেরিয়েবল যা কৌণিক.মডিউল রয়েছে

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

এটি Angularjs এর জন্য খুব নির্দিষ্ট, সমস্ত লোক এটি ব্যবহার করে না, তবে এটি আমার জন্য কাজ করেছে, আপনাকে ধন্যবাদ।
লরো 182

0

আপনার পৃষ্ঠায় jquery ui প্লাগইন যুক্ত করুন।

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

0

কোনও কিছুর জন্য নয়, তবে আরও একটি উপায় আছে। প্রথমে আপনার লিনকুই কোয়েরিটি তৈরি করুন। তারপরে, গণিত ফলাফলের একটি ক্যোয়ারী তৈরি করুন এবং যে কোনও ধরণের বিন্যাস আপনার জন্য কাজ করে তা প্রয়োগ করুন apply

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 () কল করা।

এমভিসি অ্যাকশন পদ্ধতির একটি জেএসএন ফলাফল ভিউটির সাথে সামঞ্জস্যপূর্ণ ফর্ম্যাটে তারিখটি ফিরিয়ে দেবে।

মডেল দেখুন

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

বিরক্তিকর, তাই না?

আমার সমাধানটি ছিল আমার ডাব্লুসিএফ পরিষেবাটি আরও পাঠযোগ্য (মাইক্রোসফ্ট) বিন্যাসে ডেটটাইমগুলি ফিরিয়ে আনার জন্য এটি পরিবর্তন করা change নীচে লক্ষ্য করুন, " UpdateDateOriginal", যা ডাব্লুসিএফের তারিখগুলির ডিফল্ট ফর্ম্যাট এবং আমার " UpdateDate", আরও কিছু পাঠযোগ্য able

এখানে চিত্র বর্ণনা লিখুন

এটি কীভাবে করবেন তা এখানে:

ডাব্লুসিএফ তারিখের ফর্ম্যাট পরিবর্তন করা হচ্ছে

আশাকরি এটা সাহায্য করবে.


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

আমি জেএসওএন তারিখ নিয়ে বেশ কয়েকটি সমস্যা নিয়ে এসেছি এবং এসকিউএল-এ তারিখের সমস্যাটি সমাধান করে সমস্যা থেকে মুক্তি পাওয়ার সিদ্ধান্ত নিয়েছি। তারিখের ফর্ম্যাটটিকে স্ট্রিং বিন্যাসে পরিবর্তন করুন

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">এএসপি.নেট এমভিসি থেকে পাসের তারিখ থেকে একটি মান সেট করে ।

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এমভিসি দ্বারা পাস করা জেএসএন তারিখটি কোথায় ।


-1

সবচেয়ে সহজ:

var milisegundos = parseInt (ডেটা.রেপ্লেস ("/ তারিখ (", "")। রিপ্লেস (") /", ""));
ভার নতুন তারিখ = নতুন তারিখ (মিলিসিগুন্ডো)। toLocaleDateString ("en-UE");

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.