在VB6中将日期转换为文件时间

3

我正在创建一个VB6应用程序,需要查询现有数据库,并且需要按日期进行过滤。数据库将日期存储在Windows文件时间格式中,即130159451238571322,这是2013-06-17 12:18:43.857

在VB6中是否有一种方法可以将当前日期/时间转换为Windows文件时间?

2个回答

0

经过一番调查,我发现在VB6中似乎没有任何本地函数或过程可以为您完成此操作(VB.NET允许您执行DateTime.Today.ToFileTime)。然而,这篇文章解释了Windows文件时间的计算方式-文件时间

考虑到这一点,您可以计算自1601年1月1日午夜以来已经发生的100纳秒间隔的数量,以创建准确的文件时间。


这是一个潜在的解决方案,但我该如何在VB6中实现呢?此外,结果将是一个64位数字,VB6能处理64位值吗? - Gavin Coates

0

VB6原生处理的唯一64位值是货币类型的值。然而,这些是带有隐含缩放因子10,000的有符号64位整数,因此二进制值1被视为0.0001用于算术目的。

但是,当您通过ADO从数据库检索这样的“文件时间”值时,通常会得到一个子类型为Decimal的Variant。这是完全不同的实体。

FILETIME是一个结构体,在VB6中最接近的东西是一个“UDT”,更正确地称为一个记录。因此,当您使用数据库时,需要进行一些额外的转换。

以下是一些转换的示例:

Option Explicit

Private Type OneCurrency
    Curr As Currency
End Type

Private Sub cmdConvert_Click()
    Dim DateTime As Date
    Dim FileTimeRecord As FILETIME
    Dim DecFileTime As Variant
    Dim OC As OneCurrency

    'Convert:
    DateTime = CDate(txtTime.Text)
    FileTimeRecord = DateToFileTime(DateTime)
    LSet OC = FileTimeRecord
    DecFileTime = CDec(OC.Curr) * CDec(10000)

    'Display:
    With FileTimeRecord
        lblFileTime.Caption = Right$(String$(7, "0") & Hex$(.dwHighDateTime), 8) _
                            & ":" _
                            & Right$(String$(7, "0") & Hex$(.dwLowDateTime), 8) _
                            & vbNewLine _
                            & CStr(DecFileTime)
    End With

    'Convert back, display:
    OC.Curr = DecFileTime / 10000@
    LSet FileTimeRecord = OC
    lblTime.Caption = CStr(FileTimeToDate(FileTimeRecord))
End Sub

Private Sub cmdNow_Click()
    txtTime.Text = CStr(Now())
End Sub

那个表单代码依赖于其他地方的一些声明,例如静态模块:

Option Explicit

Public Type FILETIME
    dwLowDateTime As Long
    dwHighDateTime As Long
End Type

Private Type SYSTEMTIME
    wYear As Integer
    wMonth As Integer
    wDayOfWeek As Integer
    wDay As Integer
    wHour As Integer
    wMinute As Integer
    wSecond As Integer
    wMilliseconds As Integer
End Type

Private Declare Function FileTimeToSystemTime Lib "kernel32" ( _
    ByRef lpFileTime As FILETIME, _
    ByRef lpSystemTime As SYSTEMTIME) As Long

Private Declare Function SystemTimeToFileTime Lib "kernel32" ( _
    ByRef lpSystemTime As SYSTEMTIME, _
    ByRef lpFileTime As FILETIME) As Long

Public Const ZERO_DATE As Date = 0!

Public Function DateToFileTime(ByVal DateTime As Date) As FILETIME
    Dim stLocal As SYSTEMTIME
    Dim stUniversal As SYSTEMTIME
    Dim ftResult As FILETIME

    With stLocal
        .wYear = Year(DateTime)
        .wMonth = Month(DateTime)
        .wDay = Day(DateTime)
        .wHour = Hour(DateTime)
        .wMinute = Minute(DateTime)
        .wSecond = Second(DateTime)
    End With
    SystemTimeToFileTime stLocal, ftResult
    DateToFileTime = ftResult
End Function

Public Function FileTimeToDate(ByRef FT As FILETIME) As Date
    Dim stLocal As SYSTEMTIME

    With FT
        If (.dwHighDateTime <> 0) And (.dwLowDateTime <> 0) Then
            FileTimeToSystemTime FT, stLocal
            With stLocal
                FileTimeToDate = DateSerial(.wYear, .wMonth, .wDay) _
                               + TimeSerial(.wHour, .wMinute, .wSecond)
            End With
        Else
            FileTimeToDate = ZERO_DATE
        End If
    End With
End Function

我不确定所有的错误都已经被解决了,但这应该足以让你开始了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接