【问题标题】:Trouble with date formats VBA-Excel日期格式VBA-Excel的问题
【发布时间】:2016-08-12 01:31:08
【问题描述】:

我有一个 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 使用我需要的格式?

问候,

【问题讨论】:

  • 不是一个完整的解决方案,但您可以检查“MM”的值,如果超过 12,那么您知道他们做了 MM/DD/YYYY,因为没有 13、14 等月份. 不幸的是,这不会捕获所有内容...也许您可以检查环境变量并查看。 This page 可能会有所帮助。
  • 不要使用CDate,而是使用DateSerial(Year, Month, Day) + TimeSerial(Hour, Minute, Second)。这样,无论在哪个地区,它都不会误解日期和时间结果。然后你可以随意格式化单元格。
  • @tigeravatar 那我应该用那行代码替换LocalTimeToUTC = CDate( ... wSecond)
  • 对,没错,用你的变量名表示年、月等
  • @tigeravatar 你能检查一下我刚刚在你的建议中添加的答案吗?

标签: vba excel date format


【解决方案1】:

试试:

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

【讨论】:

  • 另外,在引用您的原始文件后,变量不应该来自dteSystemTime 而不是dteLocalSystemTime
  • 好的,我会解决的。
  • 我测试了它,它对我来说效果很好,但我仍然需要墨西哥的人来测试它,这可能需要一段时间......我会及时通知你
  • 我在加拿大,我的电脑系统时钟设置为 YYMMDD,我适合做豚鼠吗?
  • 是的,如果你能帮我这个忙,那就太好了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-08
  • 2021-12-23
  • 2016-08-03
  • 2013-11-17
  • 2015-08-31
  • 1970-01-01
相关资源
最近更新 更多