2013-08-18 62 views
6

當我試圖解析日期是這樣的:解析字符串至今的奇怪錯誤?

DateTime t1 = DateTime.ParseExact("August 11, 2013, 11:00:00 PM", "MMMM dd, yyyy, hh:mm:ss tt", System.Globalization.CultureInfo.InvariantCulture); 

它正常工作,但是當我做這樣的事:

string s ="‎August ‎11, ‎2013, ‏‎11:00:00 PM"; 
DateTime t = DateTime.ParseExact(s, "MMMM dd, yyyy, hh:mm:ss tt", System.Globalization.CultureInfo.InvariantCulture); 

我得到這個錯誤:

的例外類型'System.FormatException'發生在 mscorlib.ni.dll中,但未在用戶代碼中處理

回答

10

因爲你的字符串

string s = "‎August ‎11, ‎2013, ‏‎11:00:00 PM"; 

包括0x200e(8206) character在開始和結束August。您可以通過

var chars = s.ToCharArray(); 

很容易地看到它似乎是一個複製粘貼+問題

您可以通過刪除這些字符:

var newstr = new string(s.Where(c => c <128).ToArray()) 
+0

因此,我如何刪除它,因爲我已經從模型中刺痛它? –

+2

@AhmedEmad'var newstr = new string(s1.Where(c => c <128)。ToArray())' – I4V

+0

Thanx現在很努力地工作 –

3

哈哈,我發現它。

首先,你的兩個代碼都沒有問題。兩者都很好。 只是你的字符串不相等。你的第二個隱藏的字符。

你的第一個"August 11, 2013, 11:00:00 PM".Lenth是28

但第二"‎August ‎11, ‎2013, ‏‎11:00:00 PM".Lengt是33

讓我們試試這個代碼;

string s = "August 11, 2013, 11:00:00 PM"; 
string s1 = "‎August ‎11, ‎2013, ‏‎11:00:00 PM"; 

char[] c = s.ToCharArray(); 
char[] c1 = s1.ToCharArray(); 

foreach (var ch in c) 
{ 
    Console.WriteLine(ch); 
} 

foreach (var ch1 in c1) 
{ 
    Console.WriteLine(ch1); 
} 

輸出將;

A 
u 
g 
u 
s 
t 

1 
1 
, 

2 
0 
1 
3 
, 

1 
1 
: 
0 
0 
: 
0 
0 

P 
M 
? // <-- What the hell? 
A 
u 
g 
u 
s 
t 

? // <-- What the hell? 
1 
1 
, 

? // <-- What the hell? 
2 
0 
1 
3 
, 

? // <-- What the hell? 
? // <-- What the hell? 
1 
1 
: 
0 
0 
: 
0 
0 

P 
M 

作爲一種解決方案,不要複製粘貼任何字符串到您的代碼:)。

+0

@Downvoter至少要注意,所以我可以看到_where_我可能是錯的? –

2

你的第二個字符串有隱藏的字符。

運行此:

string s1 = "August 11, 2013, 11:00:00 PM"; 
string s2 = "‎August ‎11, ‎2013, ‏‎11:00:00 PM"; 

Console.WriteLine(s1.Length); // 28 
Console.WriteLine(s2.Length); // 33 

具體而言,作爲字符數組,第二個是這樣的:

s2.ToCharArray(); 
{char[33]} 
[0]: 8206 '‎' // ???? 
[1]: 65 'A' 
[2]: 117 'u' 
[3]: 103 'g' 
[4]: 117 'u' 
[5]: 115 's' 
[6]: 116 't' 
[7]: 32 ' ' 
[8]: 8206 '‎' // ???? 
[9]: 49 '1' 
[10]: 49 '1' 
[11]: 44 ',' 
[12]: 32 ' ' 
[13]: 8206 '‎' // ???? 
[14]: 50 '2' 
[15]: 48 '0' 
[16]: 49 '1' 
[17]: 51 '3' 
[18]: 44 ',' 
[19]: 32 ' ' 
[20]: 8207 '‏' // ???? 
[21]: 8206 '‎' // ???? 
[22]: 49 '1' 
[23]: 49 '1' 
[24]: 58 ':' 
[25]: 48 '0' 
[26]: 48 '0' 
[27]: 58 ':' 
[28]: 48 '0' 
[29]: 48 '0' 
[30]: 32 ' ' 
[31]: 80 'P' 
[32]: 77 'M' 
0

我被擊中這一點。在我的情況下,UI自動化測試失敗,因爲IE似乎自動添加這個LRM(從左到右)標記(Firefox和Chrome沒有)。一條快速的代碼將其剝離:

Regex.Replace(date, @"\u200e", string.Empty)