ASP.NET MVC JsonResult-Datumsformat

248

Ich habe eine Controller-Aktion, die effektiv einfach ein JsonResult meines Modells zurückgibt. In meiner Methode habe ich also ungefähr Folgendes:

return new JsonResult(myModel);

Dies funktioniert gut, bis auf ein Problem. Das Modell enthält eine Datumseigenschaft, die im Json-Ergebnis wie folgt zurückgegeben wird:

"\/Date(1239018869048)\/"

Wie soll ich mit Daten umgehen, damit sie in dem von mir gewünschten Format zurückgegeben werden? Oder wie gehe ich mit diesem Format oben im Skript um?

Jon Archway
quelle
Ich habe mein json net-Ergebnis für dasselbe Problem veröffentlicht. Es konvertiert das Datum in das ISO-Format, was die Arbeit erheblich erleichtert. stackoverflow.com/questions/15778599/…
Kieran
Bitte schauen Sie in diesen unten stehenden Link. Geradeaus. stackoverflow.com/a/60392503/5962626
Mohamedasiq

Antworten:

195

Nur um die Antwort von casperOne zu erweitern .

Die JSON-Spezifikation berücksichtigt keine Datumswerte. MS musste einen Anruf tätigen, und der von ihnen gewählte Weg bestand darin, einen kleinen Trick in der Javascript-Darstellung von Zeichenfolgen auszunutzen: Das Zeichenfolgenliteral "/" ist dasselbe wie "\ /", und ein Zeichenfolgenliteral wird niemals serialisiert. " \ / "(sogar" \ / "muss" \\ / "zugeordnet sein).

Eine bessere Erklärung finden Sie unter http://msdn.microsoft.com/en-us/library/bb299886.aspx#intro_to_json_topic2 (scrollen Sie nach unten zu "Von JavaScript-Literalen zu JSON").

Einer der wunden Punkte von JSON ist das Fehlen eines Datums- / Zeitliterals. Viele Menschen sind überrascht und enttäuscht, dies zu erfahren, wenn sie JSON zum ersten Mal begegnen. Die einfache Erklärung (tröstlich oder nicht) für das Fehlen eines Datums- / Zeitliteral ist, dass JavaScript auch nie eines hatte: Die Unterstützung für Datums- und Zeitwerte in JavaScript wird vollständig über das Date-Objekt bereitgestellt. Die meisten Anwendungen, die JSON als Datenformat verwenden, verwenden daher im Allgemeinen entweder eine Zeichenfolge oder eine Zahl, um Datums- und Zeitwerte auszudrücken. Wenn eine Zeichenfolge verwendet wird, können Sie im Allgemeinen erwarten, dass sie im ISO 8601-Format vorliegt. Wenn stattdessen eine Zahl verwendet wird, bedeutet der Wert normalerweise die Anzahl der Millisekunden in der universellen koordinierten Zeit (UTC) seit der Epoche, wobei die Epoche als Mitternacht am 1. Januar 1970 (UTC) definiert ist. Nochmal, Dies ist eine bloße Konvention und nicht Teil des JSON-Standards. Wenn Sie Daten mit einer anderen Anwendung austauschen, müssen Sie deren Dokumentation überprüfen, um festzustellen, wie Datums- und Zeitwerte in einem JSON-Literal codiert werden. Beispielsweise verwendet ASP.NET AJAX von Microsoft keine der beschriebenen Konventionen. Vielmehr werden .NET DateTime-Werte als JSON-Zeichenfolge codiert, wobei der Inhalt der Zeichenfolge / Date (Ticks) / ist und Ticks Millisekunden seit der Epoche (UTC) darstellen. Der 29. November 1989, 4:55:30 Uhr, in UTC wird als "\ / Date (628318530718) \ /" codiert. NET AJAX verwendet keine der beschriebenen Konventionen. Vielmehr werden .NET DateTime-Werte als JSON-Zeichenfolge codiert, wobei der Inhalt der Zeichenfolge / Date (Ticks) / ist und Ticks Millisekunden seit der Epoche (UTC) darstellen. Der 29. November 1989, 4:55:30 Uhr, in UTC wird als "\ / Date (628318530718) \ /" codiert. NET AJAX verwendet keine der beschriebenen Konventionen. Vielmehr werden .NET DateTime-Werte als JSON-Zeichenfolge codiert, wobei der Inhalt der Zeichenfolge / Date (Ticks) / ist und Ticks Millisekunden seit der Epoche (UTC) darstellen. Der 29. November 1989, 4:55:30 Uhr, in UTC wird als "\ / Date (628318530718) \ /" codiert.

Eine Lösung wäre, es einfach zu analysieren:

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

Ich habe jedoch gehört, dass es irgendwo eine Einstellung gibt, DateTimemit der der Serializer Objekte mit der new Date(xxx)Syntax ausgeben kann . Ich werde versuchen, das herauszufinden.


Der zweite Parameter von JSON.parse()akzeptiert eine reviverFunktion, in der festgelegt wird, wie der ursprünglich erzeugte Wert vor der Rückgabe erzeugt wird.

Hier ist ein Beispiel für das Datum:

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

Siehe die Dokumente von JSON.parse ()

JPot
quelle
1
Danke, wohin würde das Parsen gehen?
Jon Archway
Der Code, den ich gepostet habe, ist JavaScript. Sie würden es in Ihren Client-Code einfügen.
JPot
6
Sie können das js auf ein neues Datum kürzen (parseInt (dateString.replace (/ \ / Date \ ((\ d +) \) \ // gi, "$ 1"))
kͩeͣmͮpͥ 8
6
Tatsächlich ist der reguläre Ausdruck korrekter als Ersetzen (/ \ / Datum \ ((-? \ D +) \) \ // gi, "$ 1"), da das Datum auch als -ve-Zahl dargestellt werden kann
Dokie
1
@ HarshilShah Das ist das zweite Argument für parseInt(). Es weist die Funktion an, eine Ganzzahl im Zahlensystem der Basis 10 zu extrahieren. Es ist ein Radix. Wenn Sie 8dort eingeben, wird eine Oktalzahl extrahiert.
Analogwaffe
99

Hier ist meine Lösung in Javascript - sehr ähnlich wie bei JPot, aber kürzer (und möglicherweise ein kleines bisschen schneller):

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

"value.substr (6)" entfernt den Teil "/ Date (", und die Funktion parseInt ignoriert die am Ende vorkommenden Nicht-Zahlenzeichen.

EDIT: Ich habe den Radix absichtlich weggelassen (das 2. Argument für parseInt); siehe meinen Kommentar unten . Beachten Sie außerdem, dass ISO-8601-Daten diesem alten Format vorgezogen werden. Daher sollte dieses Format im Allgemeinen nicht für Neuentwicklungen verwendet werden. In der hervorragenden Json.NET- Bibliothek finden Sie eine großartige Alternative zum Serialisieren von Daten im ISO-8601-Format.

Übergeben Sie für nach ISO-8601 formatierte JSON-Daten einfach die Zeichenfolge an den Date-Konstruktor:

var date = new Date(jsonDate); //no ugly parsing needed; full timezone support
Roy Tinker
quelle
1
+1 Ich habe Ihre einfache Lösung genommen und in eine rekursive Funktion gestellt. Siehe hier: danielsadventure.info/dotnetdatetime
Vivian River
7
Sie sollten immer einen Radix angeben, wenn Sie parseInt verwenden. [Quelle]: developer.mozilla.org/en-US/docs/JavaScript/Reference/…
John Zabroski
6
@ JohnZabroski: Jede Regel hat ihre Ausnahmen. Der .NET-Datums-Serialisierer gibt niemals Ganzzahlen mit führenden Nullen zurück, sodass wir den Radix sicher weglassen können.
Roy Tinker
4
Wir hatten fast das gleiche. Wir haben value.substr(6, 13)die anderen Nicht-Zahlenzeichen entfernt. Aber wenn Sie das tun, sind alle Daten VOR dem 26.04.1938 ungültig! Wir wussten nicht, parseIntdass die Nicht- Zahlenzeichen ignoriert werden würden. Vielen Dank!
Ralph Jansen
2
@ JohnZabroski - parseIntsollte führende Nullen ab ECMAScript ed 5 (2011) ignorieren .
RobG
69

Es gibt eine ganze Reihe von Antworten, um dies clientseitig zu handhaben, aber Sie können die Ausgabeserverseite ändern, wenn Sie dies wünschen.

Es gibt einige Möglichkeiten, dies zu erreichen. Ich beginne mit den Grundlagen. Sie müssen die JsonResult-Klasse in Unterklassen unterteilen und die ExecuteResult-Methode überschreiben. Von dort aus können Sie verschiedene Ansätze wählen, um die Serialisierung zu ändern.

Ansatz 1: Die Standardimplementierung verwendet den JsonScriptSerializer . Wenn Sie sich die Dokumentation ansehen, können Sie mit der RegisterConverters-Methode benutzerdefinierte JavaScriptConverters hinzufügen . Hierbei gibt es jedoch einige Probleme: Der JavaScriptConverter serialisiert in ein Wörterbuch, dh er nimmt ein Objekt und serialisiert in ein Json-Wörterbuch. Um das Objekt zu einer Zeichenfolge zu serialisieren, ist ein wenig Hackery erforderlich, siehe Beitrag . Dieser spezielle Hack wird auch der Zeichenfolge entkommen.

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

Ansatz 2 (empfohlen): Der zweite Ansatz besteht darin, mit dem überschriebenen JsonResult zu beginnen und mit einem anderen Json-Serializer zu arbeiten, in meinem Fall dem Json.NET- Serializer. Dies erfordert nicht die Hackerei von Ansatz 1. Hier ist meine Implementierung der JsonResult-Unterklasse:

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

Anwendungsbeispiel:

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

Zusätzliche Credits: James Newton-King

Verderblicher Dave
quelle
Und was ist mit den anderen Formaten wie Geld, Identifikationsnummern, Telefon und so weiter? Ist es nicht besser, diese Formate von ModelMetadata abzurufen und damit Modelle für Json zu serialisieren? Wie ?
Luciano
1
Dies ist die beste Lösung (Antwort von Perishable Dave). Der Server ist dafür verantwortlich, das richtige Datumsformat anzugeben. Ein benutzerdefiniertes JsonResult bietet viel mehr Vorteile und Kontrolle. Ich würde vorschlagen, eine Hilfsmethode "CustomJson (Daten)" zu implementieren, die CustomJsonResult instanziiert, da "Json (Daten)" vorhanden ist, die JsonResult mit seinen Daten instanziiert.
Sport
2
Eine Korrektur ist erforderlich, wenn Sie einen dieser Ansätze verwenden - die erste Zeile sollte lauten: private const string _dateFormat = "yyyy-MM-ddTHH: mm: ss"; Ich habe das "T" hinzugefügt.
Dominick
31

Moment.js ist eine umfangreiche Datetime-Bibliothek, die dies ebenfalls unterstützt. http://momentjs.com/docs/#/parsing/asp-net-json-dates/

Beispiel: Moment ("/ Datum (1198908717056-0700) /")

Es könnte helfen. Plunkerausgang

Eric
quelle
Laden Sie zuerst die Datei moment.js herunter. Fügen Sie in Ihrem Projekt als Verwendung hinzu moment("json_date_string_value").format('appropriate format'); , können Sie verschiedene Formatwerte auf momet.js Seite sehen
Harshil Shah
20

Ich fand , dass eine neue zu schaffen JsonResultund der Rückkehr , dass unbefriedigend ist - unter alle Anrufe ersetzen return Json(obj)mit return new MyJsonResult { Data = obj }ein Schmerz ist.


Also dachte ich mir, warum nicht einfach die JsonResultVerwendung eines 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));
            }
        }
    }
}

Dies kann auf jede Methode angewendet werden, die a JsonResultzurückgibt, um stattdessen JSON.Net zu verwenden:

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

die mit antworten wird

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

wie gewünscht!


Wenn es Ihnen nichts ausmacht, den isVergleich bei jeder Anfrage aufzurufen, können Sie Folgendes hinzufügen FilterConfig:

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

und Ihr gesamtes JSON wird jetzt mit JSON.Net anstelle des integrierten JSON serialisiert JavaScriptSerializer.

dav_i
quelle
Dies ist die einzige Antwort, die einen soliden Ansatz bietet (kann als global oder granular festgelegt werden), ohne dass seltsames Javascript inline ist. Kann ich zweimal upvoten?
T-Moty
19

Verwenden von jQuery zum automatischen Konvertieren von Datumsangaben mit $.parseJSON

Hinweis : Diese Antwort enthält eine jQuery-Erweiterung, die die automatische Unterstützung des ISO- und .net-Datumsformats hinzufügt.

Da Sie Asp.net MVC verwenden, vermute ich, dass Sie jQuery auf der Clientseite verwenden. Ich schlage vor, Sie lesen diesen Blog-Beitrag , der Code $.parseJSONzum automatischen Konvertieren von Daten für Sie enthält.

Code unterstützt Asp.net-formatierte Daten wie die von Ihnen genannten sowie ISO-formatierte Daten. Alle Daten werden automatisch mit für Sie formatiert $.parseJSON().

Robert Koritnik
quelle
2
Zuerst dachte ich, dass dieser Ansatz sehr gut funktioniert. (Informationen zum Registrieren eines Konverters in $ .ajaxSetup () finden Sie in den Kommentaren am Ende des Artikels.) Ein großer Nachteil dieser Lösung ist jedoch, dass sie keine Daten vor Epoc (1970) unterstützt beschlossen, einfach auf .asmx-Dateien zu verzichten und zu WebAPI zu wechseln, das die Daten besser formatiert (mithilfe von JSON.NET) und all diese Probleme umgeht.
ClearCloud8
11

Die Ajax-Kommunikation zwischen dem Client und dem Server umfasst häufig Daten im JSON-Format. Während JSON für Zeichenfolgen, Zahlen und Boolesche Werte gut funktioniert, kann es aufgrund der Art und Weise, wie ASP.NET sie serialisiert, zu Schwierigkeiten bei Datumsangaben kommen. Da es keine spezielle Darstellung für Datumsangaben gibt, werden sie als einfache Zeichenfolgen serialisiert. Als Lösung serialisiert der Standard-Serialisierungsmechanismus von ASP.NET Web Forms und MVC Datumsangaben in einer speziellen Form - / Datum (Ticks) / -, wobei Ticks die Anzahl der Millisekunden seit dem 1. Januar 1970 ist.

Dieses Problem kann auf zwei Arten gelöst werden:

Client-Seite

Konvertieren Sie die empfangene Datumszeichenfolge in eine Zahl und erstellen Sie ein Datumsobjekt mit dem Konstruktor der Datumsklasse mit den Häkchen als Parameter.

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

Serverseite

Die vorherige Lösung verwendet ein clientseitiges Skript, um das Datum in ein JavaScript-Datumsobjekt zu konvertieren. Sie können auch serverseitigen Code verwenden, der .NET DateTime-Instanzen im Format Ihrer Wahl serialisiert. Um diese Aufgabe auszuführen, müssen Sie Ihr eigenes ActionResult erstellen und die Daten dann wie gewünscht serialisieren.

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

Mischa
quelle
7

Ich hatte das gleiche Problem und anstatt den tatsächlichen Datumswert zurückzugeben, habe ich nur ToString ("TT MMM JJJJ") verwendet. Dann habe ich in meinem Javascript ein neues Datum (Datumswert) verwendet, wobei der Datumswert "01. Januar 2009" sein kann.

Joe
quelle
1
Dies sollte viel mehr positive Stimmen haben. Es ist mindestens so gut wie die am besten bewerteten. Ein bisschen eleganter als das Zerhacken von Saiten. Persönlich habe ich dies verwendet, aber das Datumsobjekt am Frontend nicht neu erstellt, da ich es nur anzeigen musste, also habe ich nur die (etwas anders) formatierte Zeichenfolge angezeigt. Danke für den Tipp, @Joe!
Vbullinger
1
Es unterbricht die Trennung von Bedenken, dh es wird die Sorge, wie ein Datum angezeigt wird, am vorderen Ende im hinteren Ende platziert. Aber meh, es ist noch eleganter.
A. Murray
1
Warum nicht etwas weniger Zerbrechliches verwenden ToString("o")?
Binki
"TT MMM JJJJ" wird von ECMA-262 nicht unterstützt, daher sollten Sie nicht erwarten, dass der integrierte Parser es analysiert
RobG
3

Siehe diesen Thread:

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

Grundsätzlich ist das Date()Format zwar gültiges Javascript, aber KEIN gültiges JSON (es gibt einen Unterschied). Wenn Sie das alte Format verwenden möchten, müssen Sie wahrscheinlich eine Fassade erstellen und den Wert selbst transformieren oder einen Weg finden, um beim Serializer für Ihren Typ in das zu gelangen JsonResultund ein benutzerdefiniertes Format für Datumsangaben zu verwenden.

casperOne
quelle
Denken Sie, Sie meinten "während das neue Date () -Format gültiges Javascript ist" [beachten Sie das "neue" Schlüsselwort]?
JPot
2

Nicht die eleganteste Art, aber das hat bei mir funktioniert:

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;
}
Gabe
quelle
2

Ich habe an einer Lösung für dieses Problem gearbeitet, da mir keine der oben genannten Antworten wirklich geholfen hat. Ich arbeite mit dem jquery-Wochenkalender und benötigte meine Daten, um Zeitzoneninformationen auf dem Server und lokal auf der Seite zu haben. Nachdem ich mich ein bisschen umgesehen hatte, fand ich eine Lösung, die anderen helfen könnte.

Ich verwende asp.net 3.5 im Vergleich zu 2008, asp.net MVC 2 und den jquery-Wochenkalender.

Erstens verwende ich eine von Steven Levithan geschriebene Bibliothek, die beim Umgang mit Daten auf der Client-Seite hilft, Steven Levithans Datumsbibliothek . Das isoUtcDateTime-Format ist perfekt für das, was ich brauchte. In meinem AJAX-Aufruf von jquery verwende ich die Formatfunktion, die mit der Bibliothek im isoUtcDateTime-Format bereitgestellt wird. Wenn der Ajax-Aufruf meine Aktionsmethode trifft, wird die Datetime-Art auf lokal gesetzt und spiegelt die Serverzeit wider.

Wenn ich Daten über AJAX an meine Seite sende, sende ich sie als Textzeichenfolgen, indem ich die Daten mit "TTT, TT MMM JJJJ HH ':' MM ':' SS 'GMT'zzzz" formatiere. Dieses Format kann problemlos clientseitig konvertiert werden

var myDate = new Date(myReceivedDate);

Hier ist meine Komplettlösung abzüglich der Quelle von Steve Levithan, die Sie herunterladen können:

Regler:

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>

Ich hoffe, dieses kurze Beispiel hilft anderen in der gleichen Situation, in der ich mich befand. Derzeit scheint es sehr gut mit der Microsoft JSON-Serialisierung zu funktionieren und meine Daten über Zeitzonen hinweg korrekt zu halten.

Jesse
quelle
Wenn Sie das Format des Datums angeben können, sollten Sie ISO 8601 Extended verwenden, da dies das einzige Format ist, für das ECMA-262 Unterstützung benötigt.
RobG
2

Der bessere Weg, um mit Daten in Knockoutjs umzugehen, besteht darin, die Moment-Bibliothek zu verwenden und Daten wie Boss zu behandeln. Sie können problemlos mit Daten wie / Date (-62135578800000) / umgehen. Sie müssen sich nicht darum kümmern, wie Ihr Serialisierungsdatum im Controller ist.

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

benutze es wie

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

momentjs unterstützt viele Datums- / Uhrzeitformate und Dienstprogrammfunktionen für Datumsangaben.

Ajay Kelkar
quelle
1

Formatieren Sie das Datum innerhalb der Abfrage.

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

Das einzige Problem bei dieser Lösung ist, dass Sie keine Ergebnisse erhalten, wenn einer der Datumswerte null ist. Um dies zu umgehen, können Sie entweder bedingte Anweisungen in Ihre Abfrage einfügen, BEVOR Sie das Datum auswählen, bei dem Datumsnullwerte ignoriert werden, oder Sie können eine Abfrage einrichten, um alle Ergebnisse abzurufen, und dann alle diese Informationen mithilfe einer foreach-Schleife durchlaufen und einen Wert zuweisen zu allen Daten, die null sind, BEVOR Sie Ihre SELECT neu machen.

Beispiel für beides:

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

Die zweite Option erfordert eine weitere Abfrage, damit Sie allen Nullen Werte zuweisen können. Dies und die foreach-Schleife müssten VOR Ihrer Abfrage sein, die die Werte auswählt.

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

Nur eine Idee, die ich einfacher fand als alle Javascript-Beispiele.

Tschad
quelle
1

Sie können diese Methode verwenden:

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

0

In Ihrem cshtml,

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

In Ihrer JS-Datei möglicherweise app.js,

Fügen Sie außerhalb von app.controller den folgenden Filter hinzu.

Hier ist das "mydate" die Funktion, die Sie zum Parsen des Datums aufrufen. Hier ist die "App" die Variable, die das angle.module enthält

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;
    };
});
Mohamedasiq
quelle
Dies ist sehr spezifisch für Angularjs, nicht alle Leute verwenden es, aber das hat bei mir funktioniert, danke.
Lauro182
0

füge jquery ui plugin zu deiner Seite hinzu.

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

Nicht umsonst, aber es gibt einen anderen Weg. Erstellen Sie zunächst Ihre LINQ-Abfrage. Erstellen Sie dann eine Abfrage des Aufzählungsergebnisses und wenden Sie die für Sie geeignete Formatierung an.

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

Ich muss sagen, der zusätzliche Schritt ist nervig, aber es funktioniert gut.

skrile
quelle
0

Für mich funktionierte es, ein Ansichtsmodell zu erstellen, das die Datumseigenschaft als Zeichenfolge enthielt. Zuweisen der DateTime-Eigenschaft aus dem Domänenmodell und Aufrufen von .ToString () für die date-Eigenschaft, während der Wert dem Ansichtsmodell zugewiesen wird.

Ein JSON-Ergebnis einer MVC-Aktionsmethode gibt das Datum in einem mit der Ansicht kompatiblen Format zurück.

Modell anzeigen

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

Domänenmodell

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

Controller-Aktionsmethode

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);
}
Oladipo Olasemo
quelle
0

Ärgerlich, nicht wahr?

Meine Lösung bestand darin, meinen WCF-Dienst so zu ändern, dass DateTimes in einem besser lesbaren Format (nicht von Microsoft) zurückgegeben wird. Beachten Sie unten das " UpdateDateOriginal", das das Standardformat für Datumsangaben von WCF ist, und mein " UpdateDate", das so formatiert ist, dass es besser lesbar ist.

Geben Sie hier die Bildbeschreibung ein

So geht's:

Ändern des WCF-Datumsformats

Hoffe das hilft.

Mike Gledhill
quelle
0

Ich fand, dass dies der einfachste Weg ist, es serverseitig zu ändern.

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";
        }
    }
}
Mohamed Fakhreddine
quelle
0

Ich hatte eine Reihe von Problemen mit JSON-Daten und beschloss, das Problem einfach zu beseitigen, indem ich das Datumsproblem in SQL ansprach. Ändern Sie das Datumsformat in ein Zeichenfolgenformat

select flddate from tblName

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

Durch die Verwendung von fldDateStr verschwand das Problem und ich konnte das Datumsfeld weiterhin zum Sortieren oder für andere Zwecke verwenden.

Harry Binnendyk
quelle
0

Es gibt das Server-Datumsformat zurück. Sie müssen Ihre eigene Funktion definieren.

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

Hier ist ein JavaScript-Code, den ich geschrieben habe und der einen <input type="date">Wert von einem Datum festlegt, das von ASP.NET MVC übergeben wurde.

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

Sie nennen diese Funktion folgendermaßen:

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

Wo commissionStartDateist das von MVC übergebene JSON-Datum?

Stammes-Kodierer
quelle
-1

Das einfachste:

var milisegundos = parseInt (data.replace ("/ Date (", "") .replace (") /", ""));
Var newDate = neues Datum (milisegundos). toLocaleDateString ("en-UE");

Kenlly Acosta
quelle