2016-07-27 78 views
0

我正在从已从Excel导出的CSV文件中读取数据。然后,我将这些值解析为标准格式,基本上进行一些清理,并将其放入下一列。要做到这一点,我使用VB函数,如IsNumericIsDate来试图找出数据可能是什么。这对数字等工作正常,但日期失败。下面是我交给一个真正的数据文件中的一些例子: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。

+1

各种日期格式总是有趣的处理。您可能想要创建一个辅助函数,该函数使用“DateTime.TryParseExact”,并使用您期望看到的不同格式。丑陋,但可行。 – Tim

+0

那些传统的VB函数(比如'IsDate')几乎只是普遍意识到当前的文化。如果'30/09/2017'不适合您的文化,它将失败。 – Plutonix

+0

Gah!我想我被Unix弄坏了。 –

回答

-1
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, Local, DateTimeStyles.AssumeLocal, TempD) Then 
     Return True 
    End If 
    Local = New CultureInfo("en-GB") 
    If DateTime.TryParse(input, Local, DateTimeStyles.AssumeLocal, TempD) Then 
     Return True 
    End If 
    Local = New CultureInfo("en-AU") 
    If DateTime.TryParse(input, Local, DateTimeStyles.AssumeLocal, TempD) Then 
     Return True 
    End If 
    Local = New CultureInfo("fr-FR") 
    If DateTime.TryParse(input, Local, DateTimeStyles.AssumeLocal, TempD) Then 
     Return True 
    End If 

    Return False 
End Function 
'------------------------------------------------------------------------------ 
Public Function DMYDate(input As String) As DateTime 
    Dim TempD As DateTime 
    Dim Local As CultureInfo 
    'now try things... 
    Local = New CultureInfo("en-US") 
    If DateTime.TryParse(input, Local, DateTimeStyles.AssumeLocal, TempD) Then 
     Return TempD 
    End If 
    Local = New CultureInfo("en-GB") 
    If DateTime.TryParse(input, Local, DateTimeStyles.AssumeLocal, TempD) Then 
     Return TempD 
    End If 
    Local = New CultureInfo("en-AU") 
    If DateTime.TryParse(input, Local, DateTimeStyles.AssumeLocal, TempD) Then 
     Return TempD 
    End If 
    Local = New CultureInfo("fr-FR") 
    If DateTime.TryParse(input, Local, DateTimeStyles.AssumeLocal, TempD) Then 
     Return TempD 
    End If 

    Return Nothing 
End Function 
+0

这可能会在每个月的11个日期中失败。鉴于你的日期是'5/8/2014'意思是8月5日(GB),它将在6月8日验证,因为它首先测试美国文化。 – user3697824

+0

事实上,这不是一个失败,而是一个设计特征。 –

相关问题