2009-08-03 1 views
44

Wenn ich eine DateTime nach Json in .NET analysieren, wird eine Zeichenfolge zurückgegeben (d. H. "\/Date(1249335194272)\/"). Wie kann ich dafür sorgen, dass ein js-Date-Objektkonstruktor nicht in eine Zeichenfolge eingeschlossen wird?Javascript Serialisierung von DateTime in asp.net gibt kein JavaScript-Datum Objekt?

// js server code 
var dteNow = <%= jsonDateNow %>; 


// js rendered code 
var dteNow = "\/Date(1249335477787)\/"; 


// C# 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.Script.Serialization; 
using System.Web.UI.WebControls; 

namespace testing{ 
    public partial class iTaxPrep : System.Web.UI.Page 
    { 
     protected string jsonDateNow; 
     protected void Page_Load(object sender, EventArgs e) 
     { 
      if (!IsPostBack) 
      { 
       jsonDateNow = new JavaScriptSerializer().Serialize(DateTime.Now); 

      } 
     } 
    } 
} 

Antwort

14

Dies scheint zu funktionieren (für die Idee Dank Chris S). Führen Sie in C# eine Ersetzung durch, um den Zeichenfolgen-Wrapper um das Datumsobjekt zu entfernen.

using System.Collections.Generic; 
     using System.Linq; 
     using System.Web; 
     using System.Web.UI; 
     using System.Web.Script.Serialization; 
     using System.Web.Script.Services; 
     using System.Web.Services; 
     using System.Web.UI.WebControls; 

     namespace test 
     { 
      [ScriptService] 
      public partial class testing: System.Web.UI.Page 
      { 
       protected string strCaseID; 
       protected string jsonCase; 

       protected void Page_Load(object sender, EventArgs e) 
       { 
        if (!IsPostBack) 
        { 
         strCaseID =Tools.GetQueryObject("id"); 
         // get a complex object with dates, string, arrays etc. 
         jsonESHACase = new JavaScriptSerializer().Serialize(objCase.Get(strCaseID)) 
          .Replace("\"\\/Date(", "new Date(").Replace(")\\/\"", ")"); 
        } 
       } 
      } 
     } 

..und nach den Anführungszeichen zu entfernen und die neue Prefix das funktioniert jetzt Datum js. Hurra!

testCase= <%= jsonESHACase %>; 
    if (testCase) { 
     document.write(testCase["ClosingDate"].format("MM dd yyyy")); 
    } 
+1

Ich bevorzuge diese Antwort auf die anderen Antworten, die das Problem in JS beheben. Das Problem ist in .Net, sollte also in .Net IMO gelöst werden. – Carl

0
jsonDateNow = String.Format("Date({0},{1},{2})", Date().Now.getYear(), Date().Now.getMonth() -1, Date().Now.getDay()); 
+0

Das eigentliche Problem ist, dass ich Objekte zu JSON serialisieren muss, die Daten enthalten und diese Daten clientseitig verwenden. –

-2

Dieses Beispiel funktioniert

JavaScriptSerializer serializer = new JavaScriptSerializer(); 

    DateTime dt = DateTime.Now; 
    DateTime dt1 = dt; 

    string jsonDateNow = serializer.Serialize(dt1); 
+0

was macht das überhaupt? 'DateTime dt1 = dt' tut nichts. –

55

Dies ist ein known limitation mit JSON. This answer könnten Sie, speziell helfen:

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

Definitiv die richtige Antwort, nette Post. –

+0

Das ist ziemlich viel, was ich getan habe, aber wenn ich ein großes Objekt mit mehreren Daten und anderen Informationen parse, wird das hässlich aussehen. –

+0

Sieht hässlich aus, aber es gibt keinen besseren Weg. – RredCat

3

Mit einer wenig String-Manipulation und ein eval können Sie ein Date-Objekt erstellen

var dteNow = "\/Date(1249335477787)\/"; 
var dteObj = eval("new " + dteNow.replace(/\//g,"")); 
+4

[Eval ist böse] (http://24ways.org/2005/dont-be-eval/) usw., aber ansonsten schön gemacht. – ruffin

0

ich gefunden habe, dass dies eine nützliche Technik ist, mit diesem Problem umzugehen:

http://icanmakethiswork.blogspot.co.uk/2012/04/beg-steal-or-borrow-decent-javascript.html

Es ermöglicht DateTimes als ISO 8601 Datumszeichenfolgen zu serialisieren, die mit dem JavaScript Date-Konstruktor verwendet werden können und den Vorteil haben, von Menschen gelesen zu werden fähig.

+0

Viele Ihrer Antworten scheinen nur einen Link zu Ihrem Blog-Post zu enthalten. Gibt es irgendeine Chance, dass du sie erweitern kannst, um daraus echte Antworten zu machen? Der Rest sieht gut aus und ich bin mir sicher, dass die Blogposts auch gute Antworten geben werden. – Flexo

1

Sie können dies versuchen:

"MyField: " + string.Format("(function(y,m,d,h,mm,s){{var d=new Date(Date.UTC(y,m-1,d,h,mm,s));return d;}})({0},{1},{2},{3},{4},{5})", d.Year, d.Month, d.Day, d.Hour, d.Minute, d.Second); 

Dies scheint in FF und IE zu arbeiten.

7

einfache JavaScript-Manipulation wie folgt aus:

function(param){ 
    var date = new Date(parseInt(param.substr(6))); 
    return date; 
} 

Pass in JSON Datum als param auf die Funktion und es wird eine Javascript-Datum zurück.

+0

Warum ist diese Antwort besser als die angenommene Antwort? –

+1

als dies ist eine sehr einfache Antwort, die auch korrekt ist! ^ –

0

Hier ist eine Option mit Date.parse und DateTime.ToString:

var lowerBound = new Date(Date.parse("@Model.LowerBound.ToString("MMMM dd, yyyy")")); 

Wenn Sie Zeit benötigen, sollten Sie die folgenden. Ich glaube, das auf eine neuere Javascript spec beruht:

var lowerBound = new Date(Date.parse("@Model.LowerBound.ToUniversalTime().ToString("s")")); 

Hier ist eine Option jQuery verwenden: (Ich bin sicher, es gibt eine Möglichkeit, die Zeit hier hinzufügen)

var lowerBound = $.datepicker.parseDate('yy-mm-dd', "@Model.LowerBound.ToString("yyyy-MM-dd")"); 
0

Etwas einfachere String Clean Up mit RegEx ...

var myDate = "\/Datum (1508821200000) /";
var jsDate = neues Datum (parseInt (myDate.replace (/ \ D/g, '')));

Verwandte Themen