我正在从已从Excel导出的CSV文件中读取数据。然后,我将这些值解析为标准格式,基本上进行一些清理,并将其放入下一列。要做到这一点,我使用VB函数,如IsNumeric
和IsDate
来试图找出数据可能是什么。这对数字等工作正常,但日期失败。下面是我交给一个真正的数据文件中的一些例子:IsDate(“30/09/2017”)返回false,但我不知道格式
200001
5/8/2014 0:00
30/09/2017 12:00:00 AM
2014-08-05
2017-09-30
04/06/2014 12:00:00 AM
30/06/2017 12:00:00 AM
和这里的结果:
200001 1/1/2000
5/8/2014 0:00 5/8/2014
30/09/2017 12:00:00 AM 1/1/1900
2014-08-05 8/5/2014
2017-09-30 9/30/2017
04/06/2014 12:00:00 AM 4/6/2014
30/06/2017 12:00:00 AM 1/1/1900
那么则IsDate设法理解“200001”,“2014年5月8日0:00”和“04/06/2014 12:00:00 AM”,但未能理解完全有效的“2017/9/30 12:00:00 AM”。我知道这是由于mm/dd与dd/mm有关,但由于我不知道哪一个正在被使用,在逐行的基础上,有没有人有如何处理这个问题的建议?
按照下面的建议,我尝试这样做:
Public Function IsDMYDate(input As String) As Boolean
Dim TempD As DateTime
Dim formats() As String = {"d/M/yyyy h:mm:ss tt", "d/M/yyyy h:mm tt",
"dd/MM/yyyy hh:mm:ss", "d/M/yyyy h:mm:ss",
"d/M/yyyy hh:mm tt", "d/M/yyyy hh tt",
"d/M/yyyy h:mm", "d/M/yyyy h:mm",
"dd/MM/yyyy hh:mm", "dd/mm/yyyy hh:mm",
"d-M-yyyy h:mm:ss tt", "d-M-yyyy h:mm tt",
"dd-MM-yyyy hh:mm:ss", "d-M-yyyy h:mm:ss",
"d-M-yyyy hh:mm tt", "d-M-yyyy hh tt",
"d-M-yyyy h:mm", "d-M-yyyy h:mm",
"dd-MM-yyyy hh:mm", "dd-mm-yyyy hh:mm"}
Return DateTime.TryParseExact(input, formats, New CultureInfo("en-US"), DateTimeStyles.None, TempD)
End Function
但它返回这些日期误为好。然后我在查看各种CultureInfo设置后试过这个:
Public Function IsDMYDate(input As String) As Boolean
Dim TempD As DateTime
Dim Local As CultureInfo
'now try things...
Local = New CultureInfo("en-US")
If DateTime.TryParse(input, TempD) Then
Return True
End If
Local = New CultureInfo("en-GB")
If DateTime.TryParse(input, TempD) Then
Return True
End If
Local = New CultureInfo("en-AU")
If DateTime.TryParse(input, TempD) Then
Return True
End If
Return False
End Function
它总是返回false。
各种日期格式总是有趣的处理。您可能想要创建一个辅助函数,该函数使用“DateTime.TryParseExact”,并使用您期望看到的不同格式。丑陋,但可行。 – Tim
那些传统的VB函数(比如'IsDate')几乎只是普遍意识到当前的文化。如果'30/09/2017'不适合您的文化,它将失败。 – Plutonix
Gah!我想我被Unix弄坏了。 –