DateTime.ParseExact:“字符串未被识别为有效的DateTime”

我正在尝试从javascript应用程序发送JSON请求,并在我的SQL DB中创建此对象(HourRegistration),但由于某种原因,我无法将日期从json解析为有效的DateTime。

来自JS的JSON日期

hourRegistration.Date = "12/08/2015"; 

所以dd/MM/yyyy

我试图像这样解析:

 Date = DateTime.ParseExact(hourRegistration.Date, "dd/MM/yyyy", CultureInfo.InvariantCulture) 

整个方法

 public void CreateHours(HourRegistrationDTO hourRegistration) { DAO.Instance.HourRegistration.Add(new HourRegistration() { Date = DateTime.ParseExact(hourRegistration.Date, "dd/MM/yyyy", CultureInfo.InvariantCulture), Cust_ID = hourRegistration.Cust_id, Login_ID = hourRegistration.Login_id, Hours = hourRegistration.Hours, Comment = hourRegistration.Comment }); DAO.Instance.SaveChanges(); } 

截图 在此处输入图像描述

ToCharArray()

在此处输入图像描述

我真的不知道为什么这不起作用。 据我所知,这应该有用吗?

您在hourRegistration.Date字符串值不是您认为的那样。

对于.NET中的字符串,有许多Unicode字符在调试表示中根本不出现,或者实际上不是它们看起来的字符。 在您的情况下,如ToCharArray调试扩展所示,您的字符串实际上包含许多U+200E Unicode字符’LEFT-TO-RIGHT MARK’(U + 200E)字符。

这些在调试表示中是不可见的,但在尝试解析日期时是相关的。 我不知道他们是如何到达那里或为什么他们在那里 – 这是你需要进一步研究的东西。

要解决您的直接问题,在解析日期之前,请从字符串中删除所有非ASCII字符,方法如下:

 var actualDateString = new String(hourRegistration.Date .ToCharArray() .Where(c => c <= 255) .ToArray() ); 

(我刚把它撞了出去,所以它不是很漂亮)

然后你应该能够根据需要解析actualDateString

这没有错误:

 DateTime date = DateTime.ParseExact("12/08/2015", "dd/MM/yyyy", CultureInfo.InvariantCulture); 

,所以问题必须在其他地方。

我必须假设你的hourRegistration.Date变量是空字符串。 在这种情况下,您将获得exception"String was not recognized as a valid DateTime." 在解析之前调试该值。

编辑

根据你的评论,给我们这样的屏幕截图是没有问题的:

在此处输入图像描述

只是为了确保并澄清问题范围……谢谢!

编辑2

这可能听起来很奇怪:

尝试重命名您的string属性,看看它是否正在解决问题。 在名为Datestring对象上查看以下行为

在此处输入图像描述

有人能告诉我为什么在调试器中作为DateTime对象处理? 它显然是一个string变量。

更新 :此问题已在此处详述: 字符串变量名称日期在调试器中很奇怪

目前很明显你的字符串有其他一些字符。 您可以尝试使用这样的简单自定义方法删除此字符:

  static string Validate(string dirty) { string validChars = @"0123456789/-\."; string newStr = ""; for (int i = 0; i < dirty.Length; i++) if (validChars.IndexOf(dirty[i]) > -1) newStr += dirty[i]; return newStr; } 

并使用它像:

 Date = DateTime.ParseExact(Validate(hourRegistration.Date), "dd/MM/yyyy", CultureInfo.InvariantCulture) 

请尝试:

 Date = DateTime.Parse(hourRegistration.Date, CultureInfo.GetCultureInfo("ru-Ru"));