asp.net 中 DateTime 的 Javascript 序列化没有给出 javascript 日期对象?

Posted

技术标签:

【中文标题】asp.net 中 DateTime 的 Javascript 序列化没有给出 javascript 日期对象?【英文标题】:Javascript serialization of DateTime in asp.net is not giving a javascript date object? 【发布时间】:2010-11-16 12:34:12 【问题描述】:

当我在 .Net 中将 DateTime 解析为 json 时,它会返回一个字符串(即"\/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);

            
        
    

【问题讨论】:

【参考方案1】:

这是一个带有 JSON 的known limitation。 This answer 可能会对您有所帮助,具体来说:

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

【讨论】:

这几乎就是我最终要做的,但是当我解析一个包含多个日期和其他信息的大对象时,这将开始看起来很丑。 这对我来说很好用: value = new Date(parseInt(value.replace("/Date(", "").replace(")/","")));我猜第二个参数中的 10 不是必需的,因为它在日期中附加了时间 10:00。我正在处理的日期来自服务器,并且他们在其中配置了时间,所以我不希望改变它。不过感谢您的回答! 第二个参数中的10是必须的,它是parseInt的radix参数。它不附加任何东西。它指定基数或基数的类型,没有它在不同系统上的行为可能会有所不同。 @webdeveloper parseInt 参数在Javascript The Good Parts 中(绝对值得一读)——它是 Javascript 的众多隐藏特性之一。它假设你基本上是 8 岁【参考方案2】:

这似乎可行(感谢 Chris S 的想法)。在 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"));
    

【讨论】:

比起其他解决 JS 问题的答案,我更喜欢这个答案。问题出在 .Net 中,因此应在 .Net IMO 中解决。【参考方案3】:

像这样的简单 javascript 操作:

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

将 JSON 日期作为参数传递给函数,它将返回一个 javascript 日期。

【讨论】:

【参考方案4】:

通过一些字符串操作和 eval,您可以创建一个 Date 对象

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

【讨论】:

eval is evil 等等等等,但其他方面做得很好。【参考方案5】:

你可以试试这个:

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

【讨论】:

【参考方案6】:

使用 RegEx 进行稍微简单的字符串清理:

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

【讨论】:

【参考方案7】:

这是一个使用 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")");

【讨论】:

【参考方案8】:

我发现这是处理这个问题的有用技术:

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

它允许将 DateTimes 序列化为 ISO 8601 日期字符串,该字符串可以与 JavaScript Date 构造函数一起使用,并且具有人类可读的优点。

【讨论】:

您的许多答案似乎只包含很少的内容,而只是指向您的博客文章的链接。您是否有机会扩展它们以使它们成为真正的答案?其余的看起来很棒,我相信博客文章也会给出很好的答案。【参考方案9】:
jsonDateNow = String.Format("Date(0,1,2)", Date().Now.getYear(), Date().Now.getMonth() -1, Date().Now.getDay());

【讨论】:

真正的问题是我需要将包含日期的对象序列化为 JSON 并在客户端使用这些日期。【参考方案10】:

这个例子有效

    JavaScriptSerializer serializer = new JavaScriptSerializer();

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

    string jsonDateNow = serializer.Serialize(dt1);

【讨论】:

这是在做什么? DateTime dt1 = dt 什么都不做。

以上是关于asp.net 中 DateTime 的 Javascript 序列化没有给出 javascript 日期对象?的主要内容,如果未能解决你的问题,请参考以下文章

更改 ASP.NET Core 中 DateTime 解析的默认格式

asp.net 中 DateTime 的 Javascript 序列化没有给出 javascript 日期对象?

在 C# ASP.net 中将文本框内容转换为 DateTime 格式时出错

未捕获的类型错误:$(...).datepick 不是 asp.net 中 jQuery datetime 中的函数

在 ASP.NET MVC5 中传递给控制器​​时,DateTime 字段为空

从 ajax 调用到 javascript 日期的 ASP.NET 解析 DateTime 结果