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

在VB6中将日期转换为文件时间,vb6,date-conversion,filetime,Vb6,Date Conversion,Filetime,我正在创建一个VB6应用程序,它需要查询现有的数据库,并且我需要按日期进行筛选。数据库以Windows文件时间格式存储日期,即130159451238571322,即2013-06-17 12:18:43.857 在VB6中是否有方法获取当前日期/时间并将其转换为Windows文件时间?经过一番研究,我认为没有任何本机函数或过程可以为您实现这一点(在VB6中,即VB.NET允许您执行DateTime.Today.ToFileTime),本文介绍如何计算Windows文件时间- 考虑到这一点,您可

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


在VB6中是否有方法获取当前日期/时间并将其转换为Windows文件时间?

经过一番研究,我认为没有任何本机函数或过程可以为您实现这一点(在VB6中,即VB.NET允许您执行
DateTime.Today.ToFileTime
),本文介绍如何计算Windows文件时间-


考虑到这一点,您可以计算1601年1月1日午夜和当前日期和时间(UTC)之间发生的100纳秒间隔量,以创建准确的文件时间。

VB6处理的本机唯一64位值是货币类型的值。但是,这些是有符号的64位整数,隐含的比例为10000,因此二进制值1在算术上被视为0.0001

但是,当您通过ADO从数据库中检索此类“文件时间”值时,通常会得到子类型Decimal的变体。这完全是另一种生物

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
选项显式
公共类型文件时间
dwLowDateTime尽可能长
dwHighDateTime尽可能长
端型
私有类型SYSTEMTIME
作为整数的wYear
作为整数的wmmonth
wDayOfWeek作为整数
作为整数的wDay
wHour作为整数
wMinute为整数
秒作为整数
wmill秒为整数
端型
私有声明函数FileTimeToSystemTime库“内核32”(_
ByRef lpFileTime作为文件时间_
ByRef lpSystemTime作为SYSTEMTIME)作为长
私有声明函数SystemTimeToFileTime库“内核32”(_
ByRef lpSystemTime作为SYSTEMTIME_
ByRef lpFileTime作为文件时间)长度相同
Public Const ZERO_DATE As DATE=0!
公共函数DateToFileTime(ByVal DateTime作为日期)作为FILETIME
作为系统时间的Dim stLocal
系统时间
将结果设置为FILETIME
与stLocal
.wYear=年(日期时间)
.wMonth=月份(日期时间)
.wDay=天(日期时间)
.wHour=小时(日期时间)
.wMinute=分钟(日期时间)
.wSecond=秒(日期时间)
以
SystemTimeToFileTime stLocal,ftResult
DateToFileTime=ftResult
端函数
公共函数FileTimeToDate(ByRef FT作为FILETIME)作为日期
作为系统时间的Dim stLocal
英国《金融时报》
如果(.dwHighDateTime 0)和(.dwLowDateTime 0),则
FileTimeToSystemTime FT,stLocal
与stLocal
FileTimeToDate=DateSerial(.wYear、.wMonth、.wDay)_
+时间序列(.wHour、.wMinute、.wssecond)
以
其他的
FileTimeToDate=0\u日期
如果结束
以
端函数

我不确定所有的bug是否都被压扁了,但这应该足以让您开始使用。

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