DateTime.ParseExact:"String not recognised as a valid DateTime" 日期时间解析:字符串无法识别为有效的日期时间

5

我正在尝试从JavaScript应用程序发送JSON请求,并在我的SQL数据库中创建此对象(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();
    }

屏幕截图 enter image description here

ToCharArray()

enter image description here

我不确定为什么这个不起作用。据我记得,这应该是有效的?


刚测试了你的代码,一切正常。也许是因为你使用了hourRegistration.Date而不是hourRegistration.date - Artem Kulikov
1
太好了,现在我们知道 ParseExact 没有问题!将你的 var tmp 改为 var tmp = hourRegistration.Date.ToCharArray();,然后在 Locals 窗口中检查 tmp。它们是否恰好有10个元素?它们是 49、51、47、48、56、47、50、48、49、53 吗? - AakashM
你能添加一个本地窗口的截图吗? - AakashM
@AakashM,由于我以前从未使用过“Locals”窗口,所以我需要你的帮助,可以吗? - Detilium
@AakashM 请查看主要问题。 - Detilium
显示剩余14条评论
4个回答

3

hourRegistration.Date中的字符串值并不是您想象的那样。

在.NET中,有许多Unicode字符根本不会出现在调试表示中,或者实际上不是它们所表现的字符。在您的情况下,正如ToCharArray调试展开所示,您的字符串实际上包含多个U+200E Unicode字符“从左到右标记”(U+200E)

这些在调试表示中是看不见的,但在尝试解析日期时却非常重要。我不知道它们是怎么出现的或为什么会出现-这是您需要进一步研究的问题。

要解决您的即时问题,在解析日期之前,请从您的字符串中删除所有非ASCII字符,类似于以下操作:

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

你应该能够按要求解析 actualDateString


这个完美地解决了。谢谢!非常感谢您花时间解决我的问题。 - Detilium

1

This gives no error:

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

因此,问题必须在其他地方。

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

编辑

根据您的评论,像这样给我们一个屏幕截图应该没有问题:

enter image description here

为了确保并澄清问题范围... 谢谢!

编辑2

这可能听起来很奇怪:

尝试重命名您的string属性,看看是否解决了问题。 请查看一个名为Datestring对象的以下行为。

enter image description here

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

更新: 这个问题已经在这里详细说明:String variable name Date acts weird in debugger


你假设它是空字符串,但 OP 说它是 12/08/2015。我不认为这是一个有效的答案。 - Soner Gönül
如果你已经阅读了评论,你就会知道我的字符串不是空的。 - Detilium

0

目前很明显你的字符串中含有其他字符。你可以尝试使用简单的自定义方法来删除这些字符,例如:

    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)

-1
请尝试这个:
Date = DateTime.Parse(hourRegistration.Date, CultureInfo.GetCultureInfo("ru-Ru"));

3
为什么?为什么 OP 需要使用 ru-Ru 文化而不是 InvariantCulture?这在这种情况下没有意义。 - Soner Gönül
因为"dd/MM/yyyy"是ru-Ru文化格式中的日期,但对我来说两个版本都可以很好地工作,并返回相同的结果。 - Pixel
OP已经提供了一个带有有效区域设置的字符串的确切格式,他不需要使用其他区域设置。 - Soner Gönül
分隔符无关紧要。 - Pixel
他正在尝试使用特定格式(dmy加不变的文化分隔符)解析某些内容。仅仅因为另一个特定文化匹配该格式而使用它是完全错误的。此外,它还接受(您的代码)其他不相关的格式。 - Adriano Repetti

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接