C# Javascript日期到ASP.NET日期:字符串未被识别为有效的日期时间
我通过AJAX将日期传递回我的MVC控制器,使用: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); 我得到“字符串未被识别为有效的日期时间”。这很有意义,因为字符串的
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()好的,我来试试。成功了!非常感谢你!成功了!非常感谢你!