DateTime.ParseExact未被识别为有效的DateTime

时间:2016-02-16 08:36:23

标签: vb.net datetime formatting

我尝试使用以下代码将String格式转换为Date格式:

 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,因为该字符串来自word中的表,并且由于某种原因在字符串末尾拉出一个返回

更新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是一个"响铃" (我不知道钟是什么)

2 个答案:

答案 0 :(得分:4)

旧的VB函数Trim仅从开头和结尾删除空格。使用.NET方法String.Trim代替删除所有类型whitespaces的tab字符。

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添加到代码文件的顶部。

答案 1 :(得分: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,因为不遵循标准的短日期模式或长日期模式。