我正在创建一个VB6应用程序,需要查询现有数据库,并且需要按日期进行过滤。数据库将日期存储在Windows文件时间格式中,即130159451238571322
,这是2013-06-17 12:18:43.857
在VB6中是否有一种方法可以将当前日期/时间转换为Windows文件时间?
我正在创建一个VB6应用程序,需要查询现有数据库,并且需要按日期进行过滤。数据库将日期存储在Windows文件时间格式中,即130159451238571322
,这是2013-06-17 12:18:43.857
在VB6中是否有一种方法可以将当前日期/时间转换为Windows文件时间?
经过一番调查,我发现在VB6中似乎没有任何本地函数或过程可以为您完成此操作(VB.NET允许您执行DateTime.Today.ToFileTime
)。然而,这篇文章解释了Windows文件时间的计算方式-文件时间。
考虑到这一点,您可以计算自1601年1月1日午夜以来已经发生的100纳秒间隔的数量,以创建准确的文件时间。
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
我不确定所有的错误都已经被解决了,但这应该足以让你开始了。