ASP.NET MVC JsonResult Tarih Biçimi


248

Etkili bir şekilde benim model bir JsonResult döndüren bir denetleyici eylem var. Yani, benim yöntemde aşağıdaki gibi bir şey var:

return new JsonResult(myModel);

Bu, bir sorun dışında iyi çalışır. Modelde bir date özelliği var ve bu Json sonucunda şu şekilde döndürülüyor gibi görünüyor:

"\/Date(1239018869048)\/"

İstediğim biçimde döndürülmeleri için tarihlerle nasıl başa çıkmalıyım? Veya yukarıdaki bu formatı komut dosyasında nasıl işleyebilirim?


Aynı neticeye json net sonucumu gönderdim, tarihi iso formatına dönüştürerek daha kolay çalışmasını sağlıyor. stackoverflow.com/questions/15778599/…
Kieran

Lütfen aşağıdaki bağlantıya bakın. Basit. stackoverflow.com/a/60392503/5962626
Mohamedasiq

Yanıtlar:


195

Sadece casperOne'un cevabını genişletmek için .

JSON Spec tarihi değerlerini hesaba gelmez. MS bir çağrı yapmak zorundaydı ve seçtikleri yol, dizelerin javascript gösterimlerinde küçük bir hile kullanmaktı: "/" dizgi değişkeni "\ /" ile aynıdır ve dizgi değişmezi asla " \ / "(" \ / "bile" \\ / "ile eşlenmelidir).

Daha iyi bir açıklama için http://msdn.microsoft.com/tr-tr/library/bb299886.aspx#intro_to_json_topic2 adresine bakın ("JavaScript Değişmezlerinden JSON'a" seçeneğine gidin)

JSON'un ağrılı noktalarından biri, tarih / saat değişmezinin olmamasıdır. Birçok insan JSON ile ilk karşılaştıklarında bunu öğrenince şaşırır ve hayal kırıklığına uğrar. Bir tarih / saat değişmezinin yokluğuna ilişkin basit açıklama (teselli ya da değil), JavaScript'in hiçbir zaman sahip olmadığıdır: JavaScript'te tarih ve saat değerleri desteği tamamen Date nesnesi aracılığıyla sağlanır. Bu nedenle, veri formatı olarak JSON kullanan çoğu uygulama genellikle tarih ve saat değerlerini ifade etmek için dize veya sayı kullanma eğilimindedir. Bir dize kullanılırsa, genellikle dizenin ISO 8601 biçiminde olmasını bekleyebilirsiniz. Bunun yerine, bir sayı kullanılırsa, değer genellikle çağdan beri Evrensel Koordineli Zaman (UTC) milisaniye sayısını ifade eder, burada çağ 1 Ocak 1970 (UTC) gece yarısı olarak tanımlanır. Tekrar, bu sadece bir sözleşmedir ve JSON standardının bir parçası değildir. Başka bir uygulamayla veri alışverişi yapıyorsanız, bir JSON hazır bilgisi içindeki tarih ve saat değerlerini nasıl kodladığını görmek için belgelerine bakmanız gerekir. Örneğin, Microsoft'un ASP.NET AJAX'ı açıklanan kuralların hiçbirini kullanmaz. Bunun yerine, .NET DateTime değerlerini bir JSON dizesi olarak kodlar; burada dizenin içeriği / Date (keneler) / ve keneler, çağdan (UTC) beri milisaniyeyi temsil eder. Dolayısıyla, 29 Kasım 1989 04:55:30, UTC'de "\ / Tarih (628318530718) \ /" olarak kodlanır. NET AJAX tarif edilen kuralların hiçbirini kullanmaz. Bunun yerine, .NET DateTime değerlerini bir JSON dizesi olarak kodlar; burada dizenin içeriği / Date (keneler) / ve keneler, çağdan (UTC) beri milisaniyeyi temsil eder. Dolayısıyla, 29 Kasım 1989 04:55:30, UTC'de "\ / Tarih (628318530718) \ /" olarak kodlanır. NET AJAX tarif edilen kuralların hiçbirini kullanmaz. Bunun yerine, .NET DateTime değerlerini bir JSON dizesi olarak kodlar; burada dizenin içeriği / Date (keneler) / ve keneler, çağdan (UTC) beri milisaniyeyi temsil eder. Dolayısıyla, 29 Kasım 1989 04:55:30, UTC'de "\ / Tarih (628318530718) \ /" olarak kodlanır.

Bir çözüm sadece ayrıştırmak olacaktır:

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

Ancak sözdizimi DateTimeile nesneleri çıktı serileştirici almak için bir yerde bir ayar olduğunu duydum new Date(xxx). Bunu kazmaya çalışacağım.


İkinci parametre, döndürülmeden önce başlangıçta ürettiği değerin nasıl verildiğini belirten JSON.parse()bir reviverişlevi kabul eder .

Tarih için bir örnek:

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 () belgelerine bakın


1
Teşekkürler, ayrıştırma nereye giderdi?
Jon Archway

Gönderdiğim kod JavaScript. İstemci kodunuza koyarsınız.
JPot

6
Js'yi yeni Date'ye kısaltabilirsiniz (parseInt (dateString.replace (/ \ / Tarih \ ((\ d +) \) \ // gi, "$ 1")))
kͩeͣmͮpͥ ͩ

6
Aslında regex, değiştir (/ \ / Date \ ((-? \ D +) \) \ // gi, "$ 1") olarak daha doğrudur, çünkü tarih de -ve numarası olarak gösterilebilir
Dokie

1
@HarshilShah Bu ikinci argüman parseInt(). Fonksiyona baz 10 rakam sisteminde bir tamsayının çıkarılmasını söyler. Bu bir sayı tabanı. Eğer 8oraya koyarsanız , sekizli bir sayı çıkarır.
AnalogWeapon

99

İşte benim Javascript benim çözüm - JPot gibi, ama daha kısa (ve muhtemelen biraz daha hızlı):

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

"value.substr (6)", "/ Date (" bölümünü alır ve parseInt işlevi, sonunda oluşan sayı olmayan karakterleri yok sayar.

EDIT: Ben kasıtlı olarak radix (parseInt için ikinci argüman) dışında bıraktım; bkz aşağıda yorumumu . Ayrıca, bu eski formatta ISO-8601 tarihlerinin tercih edildiğini lütfen unutmayın - bu nedenle bu format genellikle yeni geliştirme için kullanılmamalıdır. ISO-8601 biçimini kullanarak tarihleri ​​serileştiren harika bir alternatif için mükemmel Json.NET kütüphanesine bakın .

ISO-8601 biçimli JSON tarihleri ​​için dizeyi Tarih yapıcısına iletmeniz yeterlidir:

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

1
+1 Basit çözümünüzü aldım ve özyinelemeli bir işleve koydum. Buraya bakın: danielsadventure.info/dotnetdatetime
Vivian River

7
ParseInt kullanırken her zaman bir radix belirtmelisiniz. [Kaynak]: developer.mozilla.org/tr-TR/docs/JavaScript/Reference/…
John Zabroski

6
@JohnZabroski: Her kuralın istisnaları vardır. .NET tarih serileştiricisi hiçbir zaman baştaki sıfırlarla tamsayılar döndürmez, böylece sayı tabanı güvenli bir şekilde dışarıda bırakılabilir.
Roy Tinker

4
Neredeyse aynı şey vardı. value.substr(6, 13)Sayı olmayan diğer karakterleri kaldırmak için kullandık . Ancak bunu yaparsanız, 26/04/1938 ÖNCE tüm tarihler geçersizdir! parseIntSayı olmayan karakterleri göz ardı edeceğini bilmiyorduk . Teşekkürler!
Ralph Jansen

2
@ JohnZabroski - ECMAScript ed 5 (2011) parseIntitibariyle baştaki sıfırları görmezden gelmelisiniz .
RobG

69

İstemci tarafını işlemek için oldukça fazla cevap var, ancak isterseniz çıkış sunucusu tarafını değiştirebilirsiniz.

Buna yaklaşmanın birkaç yolu var, temellerden başlayacağım. JsonResult sınıfını alt sınıflandırmanız ve ExecuteResult yöntemini geçersiz kılmanız gerekir. Oradan serileştirmeyi değiştirmek için birkaç farklı yaklaşım kullanabilirsiniz.

Yaklaşım 1: Varsayılan uygulama JsonScriptSerializer'ı kullanır . Belgelere bakarsanız, özel JavaScriptConverters eklemek için RegisterConverters yöntemini kullanabilirsiniz . Bununla birlikte birkaç sorun var: JavaScriptConverter bir sözlüğe seri hale getirir, yani bir nesneyi alır ve bir Json sözlüğüne seri hale getirir. O hackery biraz gerektiren bir dizeye nesne serialize yapabilmek için, bkz yazı . Bu özel saldırı dizeden de kaçacak.

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

Yaklaşım 2 (önerilir): İkinci yaklaşım, geçersiz kılınan JsonResult ile başlamak ve başka bir Json serileştiricisine (benim durumumda Json.NET serileştiricisine) gitmek . Bu yaklaşım 1'in hacklenmesi gerektirmez. İşte benim JsonResult alt sınıf benim uygulaması:

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

Kullanım Örneği:

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

Ek kredi: James Newton-King


Peki parasal, kimlik numaraları, telefon vb. Biçimler nelerdir? Bu formatları ModelMetadata'dan almak ve Modelleri Json'a serileştirmek için kullanmak daha iyi bir yaklaşım değil mi? Nasıl ?
Luciano

1
Bu en iyi çözümdür (Bozulabilir Dave'in cevabı). Sunucu doğru tarih biçimini vermekten sorumludur. Ayrıca özel bir JsonResult'a sahip olmak çok daha fazla fayda ve kontrol sağlar. Verileri ile JsonResult başlatan "Json (veri)" var gibi CustomJsonResult başlatan yardımcı bir yöntem "CustomJson (veri)" öneririz.
spor

2
Bu yaklaşımlardan birini kullanırsanız bir düzeltme gerekir - ilk satır şu olmalıdır: private const string _dateFormat = "yyyy-AA-ggTHH: mm: ss"; "T" yi ekledim.
Dominick


20

Yeni oluşturarak bulundu JsonResultve bu dönen tatmin edici - tüm çağrıları değiştirmek zorunda return Json(obj)olan return new MyJsonResult { Data = obj }bir acıdır.


Bu yüzden anladım, neden sadece JsonResultkullanarak bir kaçırmak değil 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));
            }
        }
    }
}

Bu, JsonResultJSON.Net'i kullanmak için a döndüren herhangi bir yönteme uygulanabilir :

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

hangi ile cevap verecek

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

istediğiniz gibi!


isKarşılaştırma işlemini her istekte aramanın sakıncası yoksa bunu aşağıdakilere ekleyebilirsiniz FilterConfig:

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

ve tüm JSON'unuz artık yerleşik yerine JSON.Net ile serileştirilecek JavaScriptSerializer.


Bu, garip javascript satır içi olmadan sağlam bir yaklaşım (küresel veya granüler olarak ayarlanabilir) sağlayan tek cevaptır. İki kez oy kullanabilir miyim?
T-moty

19

Tarihleri ​​otomatik olarak dönüştürmek için jQuery kullanma $.parseJSON

Not : Bu yanıt, otomatik ISO ve .net tarih biçimi desteği ekleyen bir jQuery uzantısı sağlar.

Asp.net MVC kullandığınız için istemci tarafında jQuery kullandığınızdan şüpheleniyorum. Tarihleri ​​sizin için otomatik olarak dönüştürmek için nasıl kullanılacağına dair kod içeren bu blog gönderisini okumanızı öneririm $.parseJSON.

Kod, belirttiğiniz gibi Asp.net biçimli tarihleri ​​ve ISO biçimli tarihleri ​​destekler. Tüm tarihler kullanılarak sizin için otomatik olarak biçimlendirilir $.parseJSON().


2
İlk başta bu yaklaşımın çok işe yaradığını düşündüm. (Bir dönüştürücüyü $ .ajaxSetup () içinde nasıl kaydedeceğinize ilişkin makalenin sonunda yer alan yorumlara bakın) Ancak, bu çözümün büyük bir dezavantajı, Epoc (1970) tarihinden önceki tarihleri ​​desteklememesidir. .asmx dosyalarından vazgeçmeye ve tarihleri ​​daha iyi biçimlendiren (JSON.NET kullanarak) ve tüm bu sorunları atlatacak WebAPI'ye geçmeye karar verdi.
14:10

11

İstemci ve sunucu arasındaki Ajax iletişimi genellikle JSON biçimindeki verileri içerir. JSON, dizeler, sayılar ve Booleans için iyi çalışırken, ASP.NET'in bunları serileştirme biçimi nedeniyle tarihler için bazı zorluklar oluşturabilir. Tarihler için özel bir temsili olmadığından, düz dizeler olarak serileştirilirler. Çözüm olarak ASP.NET Web Formları ve MVC'nin varsayılan serileştirme mekanizması tarihleri ​​özel bir biçimde serileştirir - / Tarih (keneler) / - burada keneler 1 Ocak 1970'ten bu yana geçen milisaniye sayısıdır.

Bu sorun 2 şekilde çözülebilir:

müşteri tarafı

Alınan tarih dizesini bir sayıya dönüştürün ve tarih sınıfının yapıcısını keneler olarak parametre ile kullanarak bir tarih nesnesi oluşturun.

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

sunucu tarafı

Önceki çözüm, tarihi bir JavaScript Tarihi nesnesine dönüştürmek için bir istemci tarafı komut dosyası kullanır. .NET DateTime örneklerini istediğiniz biçimde serileştiren sunucu tarafı kodunu da kullanabilirsiniz. Bu görevi gerçekleştirmek için kendi ActionResult'unuzu oluşturmanız ve ardından verileri istediğiniz şekilde serileştirmeniz gerekir.

başvuru: http://www.developer.com/net/dealing-with-json-dates-in-asp.net-mvc.html


7

Aynı sorunu vardı ve gerçek tarih değerini döndürmek yerine ben sadece ToString ("gg MMM yyyy") kullandım. Sonra benim javascript yeni tarihi (datevalue) kullandım, datevalue "01 Ocak 2009" olabilir.


1
Bunun çok daha fazla oyu olmalı. En azından en çok oylananlar kadar iyi. Telleri kesmekten biraz daha zarif. Şahsen, bunu kullandım ama sadece görüntülemek için gerekli olan ön uçtaki tarih nesnesini yeniden yaratmadım, bu yüzden sadece (biraz farklı) biçimlendirilmiş dize görüntüledim. Bahşiş için teşekkürler, @Joe!
vbullinger

1
Endişelerin ayrılmasını bozar, yani bir tarihin arka uçta ön uçta nasıl gösterileceğine dair endişe bırakır. Ama meh, hala daha zarif.
A. Murray

1
Neden daha az kırılgan bir şey kullanmıyorsunuz ToString("o")?
binki

"gg MMM yyyy" ECMA-262 tarafından desteklenmez, bu nedenle yerleşik ayrıştırıcının ayrıştırılmasını
beklememelisiniz

3

Bu konuya bakın:

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

Temel olarak, Date()biçim geçerli javascript olsa da, geçerli JSON DEĞİLDİR (bir fark vardır). Eski formatı istiyorsanız, muhtemelen bir cephe oluşturmanız ve değeri kendiniz dönüştürmeniz veya türünüzde seri hale getiriciye ulaşmak için bir yol bulmanız JsonResultve tarihler için özel bir format kullanmanız gerekir.


"Yeni Date () biçimi geçerli javascript varken" ["yeni" anahtar kelimeyi not edin)?
JPot7

2

En zarif yol değil ama bu benim için çalıştı:

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

Yukarıdaki yanıtların hiçbiri bana gerçekten yardımcı olmadığından bu soruna bir çözüm üzerinde çalışıyorum. Jquery hafta takvim ile çalışıyorum ve tarihte sunucu ve yerel olarak saat dilimi bilgileri olması gerekiyordu. Biraz kazdıktan sonra, başkalarına yardımcı olabilecek bir çözüm buldum.

Asp.net 3.5, vs 2008, asp.net MVC 2 ve jquery hafta takvimi kullanıyorum,

İlk olarak, Steven Levithan tarafından yazılan ve müşteri tarafında tarihlerle başa çıkmaya yardımcı olan bir kütüphane kullanıyorum, Steven Levithan'ın tarih kütüphanesi . İsoUtcDateTime formatı ihtiyacım olan şey için mükemmel. Benim jquery AJAX çağrısında isoUtcDateTime biçiminde kütüphane ile sağlanan format işlevini kullanıyorum ve ajax çağrısı eylem yöntemime çarptığında, datetime Kind yerel olarak ayarlanır ve sunucu saatini yansıtır.

AJAX aracılığıyla sayfama tarihler gönderdiğimde, tarihleri ​​"ddd, dd MMM yyyy HH ':' mm ':' ss 'GMT'zzzz" kullanarak biçimlendirerek metin dizeleri olarak gönderirim. Bu biçim, istemci tarafı kullanılarak kolayca dönüştürülebilir

var myDate = new Date(myReceivedDate);

İşte benim tam çözüm eksi Steve Levithan kaynağı, indirebilirsiniz:

Denetleyici:

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>

Umarım bu hızlı örnek, içinde bulunduğum aynı durumda başkalarına yardımcı olur. Şu anda Microsoft JSON Serileştirme ile çok iyi çalışıyor gibi görünüyor ve zaman dilimleri arasında tarihlerimi doğru tutar.


Tarih biçimini belirtebiliyorsanız, ECMA-262'nin desteklemesi gereken tek biçim olduğu için ISO 8601 genişletilmiş seçeneğini kullanmalısınız.
RobG

2

Knockoutjs'de tarihleri ​​işlemenin en iyi yolu moment kütüphanesini kullanmak ve patron gibi tarihleri ​​işlemektir. / Date (-62135578800000) / gibi tarihlerle kolayca başa çıkabilirsiniz. Denetleyicide serileştirme tarihinizi nasıl rahatsız etmenize gerek yok.

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

gibi kullan

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

momentjs tarihlerdeki birçok tarih saat biçimini ve yardımcı program işlevini destekler.


1

Sorgudaki tarihi biçimlendirin.

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

Bu çözümle ilgili tek sorun, tarih değerlerinden HERHANGİ BİRİ boşsa sonuç alamayacağınızdır. Bu sorunu aşmak için, ya tarih boş değerlerini yok sayan tarihi seçmeden ÖNCE sorgunuza koşullu ifadeler koyabilir ya da tüm sonuçları almak için bir sorgu ayarlayabilir ve ardından bir foreach döngüsü kullanarak ve bu değerin tümünü kullanarak bir bilgi atayabilirsiniz SELECT yenisini yapmadan ÖNCE null olan tüm tarihlere.

Her ikisine de örnek:

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

İkinci seçenek tamamen başka bir sorgu gerektirir, böylece tüm boş değerlere değer atayabilirsiniz. Bu ve foreach döngüsü, değerleri seçen sorgunuzdan ÖNCE olmalıdır.

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

Tüm javascript örneklerinden daha kolay bulduğum bir fikir.


1

Bu yöntemi kullanabilirsiniz:

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

1

0

Cshtml'nizde,

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

JS Dosyanızda, belki app.js,

App.controller dışında aşağıdaki filtreyi ekleyin.

Burada "tarih", tarihi ayrıştırmak için çağırdığınız işlevdir. Burada "app", angular.module dosyasını içeren değişkendir.

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

Bu angularjs için çok spesifik, tüm insanlar bunu kullanmıyor, ama bu benim için çalıştı, teşekkür ederim.
Lauro182

0

Sayfanıza jquery ui eklentisi ekleyin.

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

0

Hiçbir şey için değil, ama başka bir yol var. İlk olarak, LINQ sorgunuzu oluşturun. Ardından, Numaralandırılmış sonucun bir sorgusu oluşturun ve sizin için uygun olan herhangi bir biçimlendirme türünü uygulayın.

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

Söylemeliyim ki, ekstra adım sinir bozucu, ama güzel çalışıyor.


0

Benim için işe yarayan, date özelliğini dize olarak içeren bir viewmodel oluşturmaktı. Etki alanı modelinden DateTime özelliğinin atanması ve viewmodel'e değer atanırken date özelliğinde .ToString () yönteminin çağrılması.

MVC eylem yönteminden alınan bir JSON sonucu, tarihle görünümün uyumlu bir biçimde döndürülür.

Modeli Görüntüle

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

Alan Adı Modeli

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

Denetleyici Eylem Yöntemi

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

Can sıkıcı, değil mi?

Benim çözüm WCF hizmetimi DateTimes daha okunabilir (Microsoft olmayan) bir biçimde döndürmesini sağlamak için değiştirmek oldu. Aşağıda, UpdateDateOriginalWCF'nin varsayılan tarih biçimi olan " UpdateDate" ve daha okunabilir bir şeye biçimlendirilmiş " " harfime dikkat edin.

resim açıklamasını buraya girin

Bunu nasıl yapacağınız aşağıda açıklanmıştır:

WCF tarih biçimini değiştirme

Bu yardımcı olur umarım.


0

Bunu sunucu tarafını değiştirmenin en kolay yolu olarak buldum.

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 tarihleri ​​ile gelip sorunları bir dizi vardı ve sadece SQL'de tarih sorunu ele alarak sorunu kurtulmaya karar verdi. Tarih biçimini dize biçimine değiştirme

select flddate from tblName

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

FldDateStr kullanarak sorun kayboldu ve ben hala tarih alanını sıralama veya diğer amaçlar için kullanabilirsiniz.


0

Sunucu Tarih Formatını döndürür. Kendi işlevinizi tanımlamanız gerekir.

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'den geçen bir tarihten bir değer ayarlayan yazdığım bazı JavaScript kodu .

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

Bu işlevi şöyle adlandırırsınız:

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

commissionStartDateMVC tarafından geçen JSON tarihi nerede ?


-1

En kolayı:

var milisegundos = parseInt (data.replace ("/ Tarih (", "") .replace (") /", ""));
Var newDate = yeni Tarih (milisegundos). toLocaleDateString ("en-UE");

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.