我可以获得与 DateTime.Now.Ticks 等效的 VBA 吗?

Posted

技术标签:

【中文标题】我可以获得与 DateTime.Now.Ticks 等效的 VBA 吗?【英文标题】:Can I get VBA equivalent of DateTime.Now.Ticks? 【发布时间】:2017-06-19 20:00:33 【问题描述】:

在 .NET 中的 VB 中,我可以使用 DateTime.Now.Ticks.ToString("x") 为多部分表单边界准备一个字符串,例如8d4b7556f42792c

我正在尝试在 Excel 中的 VBA 中获得相同的东西。

在 Excel VBA 中,我现在可以使用 DateTime.Now 获取格式:19/06/2017 20:54

不过,这并不是很有帮助,我需要将其转换为刻度字符串,然后再转换为十六进制。到目前为止,我发现 HEX(DateTime.Now) 只是给了我一个像 A79A 这样的四个字符的返回,这不是我需要的。

我可以从DateTime.Now 获得报价吗?!

编辑:我刚刚发现了这个技巧来获得某种滴答计数:

Private Declare Function GetTickCount Lib "kernel32" () As Long
MsgBox (GetTickCount())

这给了我一个负双倍左右...这可能满足我的需要,但它是现在的 TickCount 吗?

【问题讨论】:

VBA 中的日期时间?您可以使用日期。 Maciej - 是的,我刚刚尝试了MsgBox Now 没有DateTime,它成功了。但它也适用于它,并给了我可能的方法等的智能列表? 检查this @MaciejLos DateTime 是模块的名称;完全限定名称是VBA.DateTime.Now,其中VBA 是库,DateTime 是模块,Now 是返回Date 值的属性getter。完全合格的会员电话总是一个好主意。 为什么不直接使用硬编码值? 【参考方案1】:

Excel 无关紧要,DateTime 是来自VBA 标准库的模块,无论宿主如何,它总是在任何 VBA 项目中被引用。

VBA 中的 Date 本质上是 Double,其中整数部分是自 1899 年 12 月 30 日以来的天数:

?CDate(1)
12/31/1899

小数部分表示该值的 时间 部分,即一小时是 1/24,一分钟是 1/60,一秒是 1/60,一毫秒将是其中的 1/1000...

在使用它之前,您应该在MSDN 上阅读GetTickCount

经过的时间存储为 DWORD 值。因此,如果系统连续运行 49.7 天,时间将归零。若要避免此问题,请使用 GetTickCount64 函数。否则,在比较时间时检查溢出条件。

如果你得到一个负的滴答计数,这意味着你的系统已经运行了很长时间并且溢出了 DWORD 大小,32 位(即 231-1 或 2,147,483,647 )


与其使用GetTickCount 并使用或多或少无意义的“滴答声”(相对于系统正常运行时间[并且仅精确到~15ms]),为什么不使用实际系统时间并获得实际毫秒数?

定义一个SYSTEMTIME 结构:

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

声明GetSystemTime 过程:

Private Declare Sub GetSystemTime Lib "Kernel32" (ByRef lpSystemTime As SYSTEMTIME)

通过引用传递SYSTEMTIME 值来调用它:

Public Sub Test()
    Dim t As SYSTEMTIME
    GetSystemTime t
    Debug.Print t.wYear, t.wMonth, t.wDay, t.wHour, t.wMinute, t.wSecond, t.wMilliseconds
End Sub

检索到的值将是 UTC 时间,因此如果您需要本地时间,请应用适当的偏移量。

【讨论】:

以上是关于我可以获得与 DateTime.Now.Ticks 等效的 VBA 吗?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以减少 DateTime.Now.Ticks.ToString("X") 的长度并仍然保持唯一性?

使用 DateTime.Now.Ticks 生成唯一的数字 ID

请问DateTime.Now.Ticks.ToString()是啥意思

C# 怎样把 DateTime.Now.Ticks转换为常规日期的形式

DataTime.Now.Ticks的应用

JWT 验证失败