Сериализация Javascript DateTime в asp.net не дает объект даты Javascript? - PullRequest
47 голосов
/ 04 августа 2009

Когда я анализирую DateTime в json в .Net, он возвращает строку (т.е. "\/Date(1249335194272)\/"). Как сделать так, чтобы конструктор объекта js Date не переносился в строку?

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

            }
        }
    }
}

Ответы [ 11 ]

56 голосов
/ 04 августа 2009

Это известное ограничение с JSON. Этот ответ может помочь вам, в частности:

value = new Date(parseInt(value.replace("/Date(", "").replace(")/",""), 10));
14 голосов
/ 04 августа 2009

Это похоже на работу (спасибо Крису С. за идею). В C # сделайте замену, чтобы удалить оболочку строки вокруг объекта даты;

    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(")\\/\"", ")");
                    }
                }
            }
        }

.. и после удаления кавычек и добавления нового префикса в Date этот js теперь работает. Ура!

testCase= <%= jsonESHACase %>;
    if (testCase) {
        document.write(testCase["ClosingDate"].format("MM dd yyyy"));
    }
7 голосов
/ 06 июля 2012

Простые манипуляции с JavaScript, такие как:

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

Передайте дату JSON в качестве параметра функции, и она вернет дату javascript.

4 голосов
/ 16 февраля 2012

С небольшими манипуляциями со строками и eval вы можете создать объект Date

var dteNow = "\/Date(1249335477787)\/";
var dteObj = eval("new " + dteNow.replace(/\//g,""));
1 голос
/ 10 мая 2012

Вы можете попробовать это:

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

Это похоже на работу в FF и IE.

0 голосов
/ 23 октября 2017

Немного проще очистить строку с помощью RegEx:

var myDate = "\\/Date(1508821200000)\/";    
var jsDate = new Date(parseInt(myDate.replace(/\D/g, '')));
0 голосов
/ 15 июня 2014

При использовании с Json.NET или Newtonsoft.Json посмотрите по этой ссылке: Сериализация дат в формате JSON

0 голосов
/ 11 июля 2013

Вот вариант с использованием Date.parse и DateTime.ToString:

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

Если вам нужно время, учтите следующее. Я полагаю, что это зависит от более новой спецификации JavaScript:

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

Вот вариант использования jQuery: (я уверен, что есть способ добавить время здесь)

var lowerBound = $.datepicker.parseDate('yy-mm-dd', "@Model.LowerBound.ToString("yyyy-MM-dd")");
0 голосов
/ 28 апреля 2012

Я обнаружил, что это полезный метод для решения этой проблемы:

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

Позволяет сериализовать DateTimes как строки даты ISO 8601, которые могут использоваться с конструктором JavaScript Date и имеют преимущество в том, что они удобочитаемы для человека.

0 голосов
/ 04 августа 2009

Этот пример работает

    JavaScriptSerializer serializer = new JavaScriptSerializer();

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

    string jsonDateNow = serializer.Serialize(dt1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...