VBA Excel的日期格式有问题

VBA Excel的日期格式有问题,vba,excel,date,format,Vba,Excel,Date,Format,我有一个Excel工具,可以将当前时间和日期转换为UTC时间,然后将该时间和日期保存在数据库中(这也是一个Excel文件)。问题是,例如,当墨西哥有人试图使用此工具时,日期的格式不同(DD-MM-YY而不是MM-DD-YY),并且在数据库中的保存不正确。以下是将当前时间和日期转换为UTC的代码: Option Explicit Public Declare Function SystemTimeToFileTime Lib _ "kernel32" (lpSystemTime As SYS

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

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使用所需的格式

关于,请尝试:

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

这不是一个完整的解决方案,但您可以检查“MM”的值,如果它超过12,那么您就知道它们是MM/DD/YYYY,因为没有第13、14个月等。不幸的是,这不会捕获所有内容……也许您可以检查环境变量并查看。可能有帮助。不要使用
CDate
而是使用
DateSerial(年、月、日)+TimeSerial(小时、分钟、秒)
。这样,无论哪个地区,它都不会误解日期和时间结果。然后您可以按自己的意愿格式化单元格。@tigeravatar然后我应该替换该行代码的
LocalTimeToUTC=CDate(…wssecond)
?是的,这是正确的,使用您的变量名称表示年份、月份、,etc@tigeravatar你能核对一下我刚才加上你的建议的答案吗?还有,在参考了你的原文之后,变量不应该来自
dteSystemTime
而不是
dteLocalSystemTime
?好的,我会解决这个问题。我测试了它,它对我来说很好,但我仍然需要墨西哥的人来测试它,这可能需要一段时间。。。我在加拿大,我的电脑系统时钟设置为YYMMDD,我会成为一只合适的豚鼠吗?是的,会的,如果你能帮我这个忙,那就太好了。