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);
仍然得到同样的错误 请帮我解决。
答案 0 :(得分:4)
您的test
字符串包含一个ascii value为63
的秘密字符。但实际上,Unicode Character 'LEFT-TO-RIGHT MARK' (U+200E)字符等于"\u200E"
。它是UTF-16中的200E
和UTF-8中的E2 80 8E
。看一看;
它的字节表示为byte[] {226, 128, 142}
看起来你从其他地方复制了这个值。如果你手动编写字符串,它可以正常工作。
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);
的双重调整
答案 2 :(得分:1)
答案 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);