2016-02-16 77 views
1

我想使用此代碼轉換StringDate格式:DateTime.ParseExact未被識別爲有效的DateTime

Debug.Print(Trim(oTable.Cell(i + 1, 2).Range.Text.Replace(vbCr, "").Replace(vbLf, ""))) 
Tabledate = DateTime.ParseExact((Trim(oTable.Cell(i + 1, 2).Range.Text.Replace(vbCr, "").Replace(vbLf, ""))), "dd/MM/yy", CultureInfo.InvariantCulture) 

Debug.Print行帶給我的結果30/12/15,但DateTime.ParseExact線始終返回一個錯誤,指出該字符串不是有效的DateTime格式?我錯過了什麼嗎?

注:我不得不刪除尾隨回報carragies因爲字符串是從一個表中的字來,出於某種原因,翻出的字符串

更新1

結束返回訴諸絕望的措施,我已經包括在我的代碼如下:

For Each A As Char In oTable.Cell(i + 1, 2).Range.Text 
    Debug.Print(A) 
Next 

這是打印結果:

3 
0 
/
1 
2 
/
1 
5 
(extra blank char) 
(extra blank char) 

我不知道這些空白字符在哪裏或是什麼,我試過用vbTab代替,但它沒有區別。值得注意的是,字符串最初來自一個表中的單詞,它在表格單元格中的事實與這些空白字符的含義有什麼關係?

更新2

改變了調試代碼:

For Each A As Char In oTable.Cell(i + 1, 2).Range.Text 
    Debug.Print(CInt(AscW(A))) 
Next 

返回:

51 
48 
47 
49 
50 
47 
49 
53 
13 
7 

我相信意味着13是一個回車(即使它應該是修剪出來),7是一個「鍾」(我不知道鍾是什麼)

+0

更新了問題,我想讓它留在那裏,因爲'Trim'命令或'Replace'是錯誤的原因。返回的字符串在問題中是公平的,它的'30/12/15' – SilverShotBee

+0

不能使用常量「30/12/15」來重現,所以這裏有一些不清楚的地方。什麼是您的真實場所信息? – Steve

+0

@SilverShotBee:也許裏面還有其他不可見的字符,例如'VbTab'。 –

回答

4

舊的VB函數Trim只從開始和結束中刪除空格。改爲使用.NET方法String.Trim,它可以像刪除製表符一樣刪除所有種類的whitespaces

Dim celltext = oTable.Cell(i + 1, 2).Range.Text.Replace(vbCr, "").Replace(vbLf, "") 
Tabledate = DateTime.ParseExact(celltext.Trim(), "dd/MM/yy", CultureInfo.InvariantCulture) 

請注意,如果輸入可能包含無效日期,也可以使用DateTime.TryParseExact。然後沒有發生異常,但該方法返回False


既然你有回車(未末)和貝爾(末)你可能想用這個辦法應該去掉所有不需要的字符:

Dim celltext = oTable.Cell(i + 1, 2).Range.Text.Trim() 
Dim validChars = From c In celltext Where Char.IsDigit(c) OrElse Char.IsPunctuation(c) 
celltext = New String(validChars.ToArray()) 
Tabledate = DateTime.ParseExact(celltext, "dd/MM/yy", CultureInfo.InvariantCulture) 

您需要將Imports System.Linq添加到代碼文件的頂部。

+0

謝謝,這是返回'假',所以我想有一個問題,請參閱更新的問題 – SilverShotBee

+1

@SilverShotBee:所以你已經嘗試過'DateTime.ParseExact(celltext.Trim(),「dd/MM/yy」,CultureInfo .InvariantCulture)''但'celltext.Trim()'沒有刪除尾部空格?使用'Debug.Print(CInt(A))'來查看它是哪種字符。 –

+0

@Steve,再次更新,有趣的方法來獲取字符代碼!我會記得 – SilverShotBee

0

我相信生成的字符串不是正確的模式。 請注意CultureInfo.InvariantCulture需要一定的日期時間格式來使其工作。

CultureInfo c1 = CultureInfo.InvariantCulture; 

Console.WriteLine(c1.DateTimeFormat.ShortDatePattern.ToString()); 
Console.WriteLine(c1.DateTimeFormat.LongDatePattern.ToString()); 

你會看到有以下幾種

MM/dd/yyyy 
dddd, dd MMMM yyyy 

的DateTime.ParseExact將拋出出現FormatException因爲標準短日期模式或長日期格式後沒有使用所需要的格式。

相關問題