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
属性,看看它是否正在解决问题。 在名为Date
的string
对象上查看以下行为
有人能告诉我为什么在调试器中作为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"));