将String转换为DateTime时出错。 " String未被识别为有效的DateTime。"

时间:2014-07-16 06:35:08

标签: c# string datetime

String test = "‎22/11/2009";

我尝试了以下步骤,但没有运气

1)DateTime date = DateTime.ParseExact(test, "dd/MM/yyyy", null)

2)DateTime.ParseExact(test, "MM/dd/yyyy", CultureInfo.InvariantCulture);

但它仍然给出错误“String未被识别为有效的DateTime。”

我尝试了以下

String test = "‎22/11/2009";
IFormatProvider provider = new System.Globalization.CultureInfo("en-US");
DateTime date = DateTime.ParseExact(test, "dd/MM/yyyy", provider);

仍然得到同样的错误 请帮我解决。

5 个答案:

答案 0 :(得分:4)

您的test字符串包含一个ascii value63的秘密字符。但实际上,Unicode Character 'LEFT-TO-RIGHT MARK' (U+200E)字符等于"\u200E"。它是UTF-16中的200EUTF-8中的E2 80 8E。看一看;

enter image description here

它的字节表示为byte[] {226, 128, 142}

enter image description here

看起来你从其他地方复制了这个值。如果你手动编写字符串,它可以正常工作。

string s = "22/11/2009";
DateTime dt;
if(DateTime.TryParseExact(s, "dd/MM/yyyy", CultureInfo.InvariantCulture,
                          DateTimeStyles.None, out dt))
{
    Console.WriteLine(dt); // 22.11.2009 00:00:00
}

答案 1 :(得分:2)

在字符串的开头似乎有一个Left to Right Mark - 3个字节,通过查看调试器中的字符串是不可见的。

  

从左到右标记(LRM)是一个控制字符或不可见的格式化字符,用于包含混合的从左到右脚本(如英语和俄语)和右对齐的文本的计算机排版。左脚本(如阿拉伯语,波斯语和希伯来语)。它用于设置相邻字符相对于文本方向分组的方式。

3个字节是0xe2 0x80 0x8e,它们导致错误。

String test = "‎22/11/2009";
var hex = BitConverter.ToString(Encoding.UTF8.GetBytes(test));

看看十六进制 - 如果你可以摆脱这些字节,那么解析就可以了。您可以通过执行以下操作删除3个字节:

var test2 = new string(test.Where(c => c <128).ToArray())

然后进行解析:

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

这实际上是Strange error when parsing string to date

的双重调整

答案 2 :(得分:1)

DateTime.ParseExact(test, "dd/MM/yyyy", new CultureInfo("en-US"));

将服务于您的目的。

<强> Fiddle Demo

答案 3 :(得分:0)

您需要在CultureInfo.InvariantCulture中指定文化格式,&#34; en-us&#34;例如。使用您当前使用的Cultureinfo,此字符串无效。

e.g。

  

System.Globalization.CultureInfo enUS = new   System.Globalization.CultureInfo(&#34;的en-US&#34)

答案 4 :(得分:-1)

试试这个

CultureInfo provider = CultureInfo.InvariantCulture;            
System.Globalization.DateTimeStyles style = DateTimeStyles.None;
string test = "22/11/2009";
DateTime date = DateTime.ParseExact(test, "dd/MM/yyyy",provider,style);