我尝试使用以下代码将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是一个"响铃" (我不知道钟是什么)
答案 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,因为不遵循标准的短日期模式或长日期模式。