2016-04-19 86 views
2

我有一个Excel工具,将当前时间和日期转换为UTC时间,然后将时间和日期保存在数据库(也是Excel文件)中。问题是,例如,墨西哥的某个人试图使用此工具时,日期的格式不同(DD-MM-YY而不是MM-DD-YY),并将其错误地保存在数据库中。下面是当前日期和时间转换为UTC代码:日期格式故障VBA-Excel

Option Explicit 

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

Public Declare Function LocalFileTimeToFileTime Lib _ 
    "kernel32" (lpLocalFileTime As FILETIME, _ 
    lpFileTime As FILETIME) As Long 

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

Public Type FILETIME 
    dwLowDateTime As Long 
    dwHighDateTime As Long 
End Type 

Public 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 

Public Function LocalTimeToUTC(dteTime As Date) As Date 

    Dim dteLocalFileTime As FILETIME 
    Dim dteFileTime As FILETIME 
    Dim dteLocalSystemTime As SYSTEMTIME 
    Dim dteSystemTime As SYSTEMTIME 

    dteLocalSystemTime.wYear = CInt(Year(dteTime)) 
    dteLocalSystemTime.wMonth = CInt(Month(dteTime)) 
    dteLocalSystemTime.wDay = CInt(Day(dteTime)) 
    dteLocalSystemTime.wHour = CInt(Hour(dteTime)) 
    dteLocalSystemTime.wMinute = CInt(Minute(dteTime)) 
    dteLocalSystemTime.wSecond = CInt(Second(dteTime)) 

    Call SystemTimeToFileTime(dteLocalSystemTime, _ 
     dteLocalFileTime) 
    Call LocalFileTimeToFileTime(dteLocalFileTime, _ 
     dteFileTime) 
    Call FileTimeToSystemTime(dteFileTime, dteSystemTime) 

    LocalTimeToUTC = CDate(dteSystemTime.wMonth & "/" & _ 
     dteSystemTime.wDay & "/" & _ 
     dteSystemTime.wYear & " " & _ 
     dteSystemTime.wHour & ":" & _ 
     dteSystemTime.wMinute & ":" & _ 
     dteSystemTime.wSecond) 
End Function 

然后在这里被写入的日期和时间的计算公式:localtimetoutc(NOW())

然后我保存这个单元格的值成VBA变量(变量变量),然后将该变量的值粘贴到数据库中。它适用于美国的用户,但有时对于非美国用户而言却失败了。我怎样才能确保它不会失败?也就是说,我如何强制VBA使用我需要的格式?

问候,

+0

没有一个全面的解决方案,但你可以检查值作为 “MM”,如果它是超过12,那么你知道他们做了MM/DD/YYYY ,因为没有月13,14等。不幸的是,这不会抓住所有东西......也许你可以检查环境变量并查看。 [本页](http://www.utteraccess.com/forum/index.php?showtopic=1039007)可能会有所帮助。 – BruceWayne

+1

而不是使用'CDate'使用'DateSerial(年,月,日)+ TimeSerial(小时,分钟,秒)'。这样不管区域如何,它都不会误解日期和时间结果。然后,您可以根据需要格式化单元格。 – tigeravatar

+0

@tigeravatar然后,我应该替换该行代码的'LocalTimeToUTC = CDate(... wSecond)'? –

回答

0

尝试:

Public Function LocalTimeToUTC(dteTime As Date) As Date 

    Dim dteLocalFileTime As FILETIME 
    Dim dteFileTime As FILETIME 
    Dim dteLocalSystemTime As SYSTEMTIME 
    Dim dteSystemTime As SYSTEMTIME 

    dteLocalSystemTime.wYear = CInt(Year(dteTime)) 
    dteLocalSystemTime.wMonth = CInt(Month(dteTime)) 
    dteLocalSystemTime.wDay = CInt(Day(dteTime)) 
    dteLocalSystemTime.wHour = CInt(Hour(dteTime)) 
    dteLocalSystemTime.wMinute = CInt(Minute(dteTime)) 
    dteLocalSystemTime.wSecond = CInt(Second(dteTime)) 

    Call SystemTimeToFileTime(dteLocalSystemTime, _ 
     dteLocalFileTime) 
    Call LocalFileTimeToFileTime(dteLocalFileTime, _ 
     dteFileTime) 
    Call FileTimeToSystemTime(dteFileTime, dteSystemTime) 

    LocalTimeToUTC = DateSerial(dteSystemTime.wYear, dteSystemTime.wMonth, dteSystemTime.wDay) + TimeSerial(dteSystemTime.wHour, dteSystemTime.wMinute, dteSystemTime.wSecond) 
End Function 
+0

看起来不错,你有机会测试它吗? – tigeravatar

+2

此外,引用你的原始后,不应该从'dteSystemTime'而不是'dteLocalSystemTime'变量? – tigeravatar

+0

对,我会解决这个问题。 –