C# Javascript日期到ASP.NET日期:字符串未被识别为有效的日期时间

C# Javascript日期到ASP.NET日期:字符串未被识别为有效的日期时间,c#,javascript,asp.net,asp.net-mvc,datetime,C#,Javascript,Asp.net,Asp.net Mvc,Datetime,我通过AJAX将日期传递回我的MVC控制器,使用: date.GetDate().toLocaleDateString(); 这将产生“4/5/2014”的价值。。。当我尝试在控制器内使用以下命令转换此命令时: DateTime myDate = DateTime.ParseExact(request.Params["myDate"], "dd/MM/yyyy", CultureInfo.InvariantCulture); 我得到“字符串未被识别为有效的日期时间”。这很有意义,因为字符串的

我通过AJAX将日期传递回我的MVC控制器,使用:

date.GetDate().toLocaleDateString();
这将产生“4/5/2014”的价值。。。当我尝试在控制器内使用以下命令转换此命令时:

DateTime myDate = DateTime.ParseExact(request.Params["myDate"], "dd/MM/yyyy", CultureInfo.InvariantCulture);
我得到“字符串未被识别为有效的日期时间”。这很有意义,因为字符串的格式不正确。。。当我将字符串硬编码为:“04/05/2014”时,它将解决我的问题

是否有任何方法可以修复来自javascript的格式,而不必将字符串拆分为日、月、年,并以正确的格式重新组装

任何建议都将不胜感激

多谢各位

其他信息:

string myRequestDate = request.Params["myDate"];
string myViewBagDate = ViewBag.MyDate;

//This line passes
DateTime date1 = DateTime.ParseExact(myViewBagDate, "d/M/yyyy", CultureInfo.InvariantCulture);

//This line fails...
DateTime date5 = DateTime.ParseExact(myRequestDate, "d/M/yyyy", CultureInfo.InvariantCulture);
当我在两个字符串变量上添加一个手表时,我能看到的所有值都是相同的,但由于某种原因,第二行失败了

所以当我把myRequestDate看作一个字符数组时,我看到里面有一堆看起来根本不像日期的东西


只需更改用于匹配JavaScript日期的格式字符串即可

DateTime.ParseExact(request.Params["myDate"], "d/M/yyyy", CultureInfo.InvariantCulture);

只需更改用于匹配JavaScript日期的格式字符串

DateTime.ParseExact(request.Params["myDate"], "d/M/yyyy", CultureInfo.InvariantCulture);
此代码:

var d=new Date();
console.log(d.toString());
在windows 8.1中,Chrome会执行此输出

"Wed Jun 04 2014 20:38:23 GMT+0200 (Hora de verano romance)"
但是在库本图的克罗米乌姆

"Wed Jun 04 2014 20:38:23 GMT+0200 (CEST)"
非常相似,但是其他浏览器返回不同的格式,我使用这个函数,可以很好地处理各种格式

public static DateTime ParseDate(string value)
    {
        if (value == null)
        {
            throw new ArgumentNullException("value");
        }
        string[] formats = {"ddd MMM dd yyyy hh:mm:ss 'UTC'zzz",
                           "ddd MMM d yyyy hh:mm:ss 'UTC'zzz",
                            "ddd MMM d hh:mm:ss 'UTC'zzz yyyy",
                            "ddd MMM dd hh:mm:ss 'UTC'zzz yyyy",
                            "ddd MMM dd yyyy hh:mm:ss 'GMT'zzz",
                           "ddd MMM d yyyy hh:mm:ss 'GMT'zzz",
                           "ddd MMM d hh:mm:ss 'GMT'zzz yyyy",
                            "ddd MMM dd hh:mm:ss 'GMT'zzz yyyy",
                            "dd-MM-yyyy",
                            "yyyy-MM-dd'T'hh:mm:ss"
                           };
        DateTime fecha;
        //Try the default
        if (!DateTime.TryParse(value, out fecha))
        {
            if (!DateTime.TryParseExact(value, formats,
                                       new CultureInfo("en-US"),
                                       DateTimeStyles.None, out fecha))
            {
                if (value.Length > 24)
                {
                    return ParseDate(value.Substring(0, 24));
                }
                else
                {
                    throw new FormatException();
                }
            }

        }
        return fecha;

    }
此代码:

var d=new Date();
console.log(d.toString());
在windows 8.1中,Chrome会执行此输出

"Wed Jun 04 2014 20:38:23 GMT+0200 (Hora de verano romance)"
但是在库本图的克罗米乌姆

"Wed Jun 04 2014 20:38:23 GMT+0200 (CEST)"
非常相似,但是其他浏览器返回不同的格式,我使用这个函数,可以很好地处理各种格式

public static DateTime ParseDate(string value)
    {
        if (value == null)
        {
            throw new ArgumentNullException("value");
        }
        string[] formats = {"ddd MMM dd yyyy hh:mm:ss 'UTC'zzz",
                           "ddd MMM d yyyy hh:mm:ss 'UTC'zzz",
                            "ddd MMM d hh:mm:ss 'UTC'zzz yyyy",
                            "ddd MMM dd hh:mm:ss 'UTC'zzz yyyy",
                            "ddd MMM dd yyyy hh:mm:ss 'GMT'zzz",
                           "ddd MMM d yyyy hh:mm:ss 'GMT'zzz",
                           "ddd MMM d hh:mm:ss 'GMT'zzz yyyy",
                            "ddd MMM dd hh:mm:ss 'GMT'zzz yyyy",
                            "dd-MM-yyyy",
                            "yyyy-MM-dd'T'hh:mm:ss"
                           };
        DateTime fecha;
        //Try the default
        if (!DateTime.TryParse(value, out fecha))
        {
            if (!DateTime.TryParseExact(value, formats,
                                       new CultureInfo("en-US"),
                                       DateTimeStyles.None, out fecha))
            {
                if (value.Length > 24)
                {
                    return ParseDate(value.Substring(0, 24));
                }
                else
                {
                    throw new FormatException();
                }
            }

        }
        return fecha;

    }
字符8206(U+200E)是Unicode从左到右的标记(不可见)。 试着找出它的来源,并从源头上删除它

作为一种解决方法,您可以在解析日期之前去掉这些字符:

myRequestDate = myRequestDate.Replace("\u200E", "");
DateTime date5 = DateTime.ParseExact(myRequestDate, "d/M/yyyy", CultureInfo.InvariantCulture);
字符8206(U+200E)是Unicode从左到右的标记(不可见)。 试着找出它的来源,并从源头上删除它

作为一种解决方法,您可以在解析日期之前去掉这些字符:

myRequestDate = myRequestDate.Replace("\u200E", "");
DateTime date5 = DateTime.ParseExact(myRequestDate, "d/M/yyyy", CultureInfo.InvariantCulture);

在客户端使用以下代码:

    (date.GetDate()).toDateString();
在控制器端:

    var date = Convert.ToDateTime(Request.Params["myDate"]);

在客户端使用以下代码:

    (date.GetDate()).toDateString();
在控制器端:

    var date = Convert.ToDateTime(Request.Params["myDate"]);


因此,如果我这样做,这将起作用:ViewBag.MyDate=“3/2/2014”;DateTime date1=DateTime.ParseExact(ViewBag.MyDate,“d/M/yyyy”,CultureInfo.InvariantCulture);但是,当我这样尝试时:DateTime date1=DateTime.ParseExact(request.Params[“ViewModel[RangeFrom]”],“d/M/yyyy”,CultureInfo.InvariantCulture);我得到了与以前相同的错误…有趣的是,如果我将request.param的值分配给viewbag,它将以字符串的形式出现相同的值,它也将失败。ViewBag.MyDate=request.Params[“ViewModel[RangeFrom]”;DateTime date1=DateTime.ParseExact(ViewBag.MyDate,“d/M/yyyy”,CultureInfo.InvariantCulture);因此,如果我这样做,这将起作用:ViewBag.MyDate=“3/2/2014”;DateTime date1=DateTime.ParseExact(ViewBag.MyDate,“d/M/yyyy”,CultureInfo.InvariantCulture);但是,当我这样尝试时:DateTime date1=DateTime.ParseExact(request.Params[“ViewModel[RangeFrom]”],“d/M/yyyy”,CultureInfo.InvariantCulture);我得到了与以前相同的错误…有趣的是,如果我将request.param的值分配给viewbag,它将以字符串的形式出现相同的值,它也将失败。ViewBag.MyDate=request.Params[“ViewModel[RangeFrom]”;DateTime date1=DateTime.ParseExact(ViewBag.MyDate,“d/M/yyyy”,CultureInfo.InvariantCulture);为
myViewBagDate==myRequestDate
添加一个watch。奇怪的是,在尝试对该表达式进行watch时,我得到了“此表达式会产生副作用并且不会被评估”。那么
myViewBagDate.Length
myRequestDate.Length
呢?因此我在即时窗口中尝试了一下,结果如下:?myRequestDate==myViewBagDate是否为false?“我的请求日期”‎3.‎/‎5.‎/‎2014" ? myViewBagDate“3/2/2014”哇,myRequestDate.Length=13和myViewBagDate.Length=8?!?!但是,当查看时,两者是相同的!为
myViewBagDate==myRequestDate
添加一个watch。奇怪的是,在尝试对该表达式进行watch时,我得到了“此表达式会产生副作用并且不会被评估”。那么
myViewBagDate.Length
myRequestDate.Length
呢?因此我在即时窗口中尝试了一下,结果如下:?myRequestDate==myViewBagDate是否为false?“我的请求日期”‎3.‎/‎5.‎/‎2014" ? myViewBagDate“3/2/2014”哇,myRequestDate.Length=13和myViewBagDate.Length=8?!?!但是,当查看时,两者是相同的!我假设我会将日期格式添加到格式数组中?我得到了一个类似的无效日期格式错误…当然,如果您和数组中的其他格式被用来尝试转换。对,所以我将我的格式添加到数组中,仍然得到一个验证错误…但最好是使用toLocaleDateString()传递te数据,而不传递数据,否则,您可能会遇到麻烦,因为系统在您查看时具有不同的区域设置,请尝试仅使用toString()。好的,我会试一试。我假设我会将日期格式添加到格式数组中?我得到了一个类似的无效日期格式错误…当然,如果您和数组中的其他格式被用来尝试转换。对,所以我将我的格式添加到数组中,仍然得到一个验证错误…但最好是使用toLocaleDateString()传递te数据,而不传递数据,另外,你可能会遇到麻烦的是,当你检查时,系统有不同的区域设置,试着只使用toString()好的,我来试试。成功了!非常感谢你!成功了!非常感谢你!