从字符串“8/5/2014”到“日期”类型的转换无效

时间:2014-08-29 13:46:40

标签: vb.net date visual-studio-2012 date-conversion

我的代码已从图像文件中检索“Date Taken”属性并将其存储为字符串。然后它将该字符串传递回Main Sub,并尝试将其与其他日期(系统时间)进行比较。我收到一条错误消息,说我无法将字符串日期转换为日期。 (从字符串“8/5/2014”到“日期”类型的转换无效。)

在下面的代码中有两条注释掉的行。当执行这些行时,程序按预期工作(字符串转换为日期)。注释掉的行中的日期完全匹配(视觉上)程序化获取日期;虽然如果我从观察窗口复制和粘贴它也会失败。

    Imports System.IO
    Imports System.Globalization

Module Module1

    Sub Main()

        Dim topLevelFolder As New DirectoryInfo("C:\Users\amitchell\Desktop\test1\")
        Dim cutoffDate As DateTime = DateTime.Now.AddDays(-30)
        Dim Dtaken As String
        Dim PassFile
        Dim Dtaken2

        Using outputFile As New StreamWriter("output_file.txt")
            For Each currentFile In topLevelFolder.EnumerateFiles("*.*", SearchOption.AllDirectories)
                PassFile = currentFile.FullName
                Dtaken = GetProperty(PassFile, 12)
                'Dtaken = "8/5/2014"
                'Dtaken2 = IsDate(Dtaken)
                If Dtaken > cutoffDate Then
                    outputFile.WriteLine(currentFile.FullName)
                End If
            Next
        End Using

    End Sub

    Function GetProperty(strFile, n)
        Dim objShell As Object
        Dim objFolder
        Dim objFolderItem
        Dim i
        Dim strPath
        Dim strName
        Dim intPos

        On Error GoTo ErrHandler

        intPos = InStrRev(strFile, "\")
        strPath = Left(strFile, intPos)
        strName = Mid(strFile, intPos + 1)
        objShell = CreateObject("shell.application")
        objFolder = objShell.NameSpace(CObj(strPath))
        objFolderItem = objFolder.ParseName(strName)
        If Not objFolderItem Is Nothing Then
            GetProperty = objFolder.GetDetailsOf(objFolderItem, n)
            GetProperty = Left(GetProperty, InStrRev(GetProperty, " ") - 1)
            GetProperty = Left(GetProperty, InStrRev(GetProperty, " ") - 1)
        End If

ExitHandler:
        objFolderItem = Nothing
        objFolder = Nothing
        objShell = Nothing
        Exit Function

ErrHandler:
        MsgBox(Err.Description, vbExclamation)
        Resume ExitHandler
    End Function


End Module

3 个答案:

答案 0 :(得分:1)

那段代码让我难过。它遵循了许多对vb6 / vbscript时代有意义的约定,但对于.Net代码来说并不是那么好。结果是,大部分代码都复制了.Net Framework为您处理(并且做得更好)的工作。我会赞赏你拥抱Using块,所以有希望。

此代码更好地利用.Net Framework。它永远不会将任何日期值渲染为字符串,从而完全回避您的问题。

Imports System.IO

Module Module1

    Sub Main()
        Dim topLevelFolder As New DirectoryInfo("C:\Users\amitchell\Desktop\test1\")
        Dim cutoffDate As DateTime = DateTime.Now.AddDays(-30).Date

        Using outputFile As New StreamWriter("output_file.txt")
            Dim files = topLevelFolder.EnumerateFileSystemInfos("*.*", SearchOption.AllDirectories).
                   Where( Function(f) f.CreationTime > cutoffDate )
            For Each file in files
                outputFile.WriteLine(file.FullName)
            Next file
        End Using
    End Sub

End Module

答案 1 :(得分:0)

我不确定为什么一个String会在另一个人无法工作的地方工作。您通常需要将String转换为DateTime才能进行比较。请尝试以下方法:

Dim dt As DateTime = DateTime.Parse(Dtaken)

然后

If dt > cutoffDate Then
编辑:我选择乔尔的答案作为最可能的解决方案,但为了附上评论,我会将此保留在这里。

答案 2 :(得分:0)

您在其中一条评论中提供的日期字符串在每个日期部分U+0000的开头包含三个(?8/?5/?2014)字符,其中?表示U+0000的出现

您需要将其删除才能使日期有效。