【问题标题】:How do you get the current time in milliseconds (long), in VB.Net?在 VB.Net 中,您如何获得以毫秒(长)为单位的当前时间?
【发布时间】:2010-12-08 09:22:24
【问题描述】:

我正在寻找与 VB.NET 中的 Java System.currentTimeMilli() 等效的东西。

调用的方法是什么?我知道 Datetime.Now,但不知道实际转换为长毫秒。


关于我的具体需求的更多细节:

我需要管理登录过期时间。所以很可能当我登录时,我会设置一个“expiration_time_milli”,等于当前时间+超时值。然后,如果我想检查我的登录是否有效,我会检查“expiration_time_milli”是否仍然优于当前时间。

【问题讨论】:

  • +1 了解更多详情。最好解释您的问题并询问the .Net way,而不是寻找Java 解决方案的准确翻译。后者将生成更长的代码,并且对于有经验的 .Net 开发人员来说看起来有点奇怪。
  • @MarkJ - 是的,我很快就写了我的第一个问题(在这个特定时刻没有时间);只有在我添加了细节之后,才看到确切的翻译确实不合适或效率不高。不过,给出的答案帮助我理解了这一切的对象(例如,通过给定的例子发现 TimeLapse)。

标签: vb.net time


【解决方案1】:

获取当前时间与时间原点的差,使用TotalMilliseconds属性获取时间跨度为毫秒,并将其转换为long。

DirectCast((Datetime.Now - New DateTime(1970, 1, 1)).TotalMilliseconds, Int64)

【讨论】:

  • 如果代码会被频繁调用,我可能会创建一个静态(VB 中的Shared)变量来保存New DateTime(1970, 1, 1) 值,因为它是静态的。无需为每次调用重新创建对象。
  • 或 CLng((Datetime.Now - New DateTime(1970, 1, 1)).TotalMilliseconds)
  • DateTime.Now 提供系统本地时区的时间;使用 Ticks 的值 not 等同于 System.currentTimeMillis(),它返回自 Unix 纪元以来经过的时间 - 即它对系统时区 敏感。使用 DateTime.UtcNow 会更好,但现在有一个更简单的替代方案 - 有关详细信息,请参阅我的答案。
【解决方案2】:

你可以使用

(DateTime.Now-new DateTime(1970,1,1)).TotalMilliseconds

顺便说一句,只是通过你的问题来猜测你可能对你更有用的是什么

DateTime.UtcNow

【讨论】:

  • DateTime.UtcNow 在这里是正确的方法,而不是 DateTime.Now。
【解决方案3】:

看到这里提到DateTime.Now 的所有答案有点令人震惊,它返回本地 时间(如“在系统默认时区”中) - 而System.currentTimeMillis() 返回数字自 Unix 纪元 (1970-01-01T00:00:00Z) 以来的毫秒数。这里的所有答案可能都应该参考DateTime.UtcNow

幸运的是,在提出这个问题之后,通过DateTimeOffset.ToUnixTimeMilliseconds() 提供了一种更简单的方法。所以你只需要:

Dim millis = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()

【讨论】:

  • 将已接受的答案切换到此答案,以提供更准确/实际内容的更多可见性。从技术上讲,我有更具体的需求,但老实说,现在更多的是关于标题中提出的一般性问题,而不是关于我十年前的个人案例(哦,我的)
【解决方案4】:

关于信息,我的个人情况是用另一种方式解决的,没有得到与 System.currentTimeMilli() 完全相同的值:

Dim loginExpirationDate As Date

'...

'Checking code:
If (loginExpirationDate < DateTime.Now) Then
    reconnect()
End If

'update the expiration date
loginExpirationDate = DateTime.Now.AddMilliseconds(timeoutMilli)

【讨论】:

  • 请注意,使用DateTime.Now 可能会在时区偏移转换(例如夏令时更改)周围搞砸。
【解决方案5】:

如果您只是在寻找唯一编号,您也可以使用此值。 DateTime.Now.Ticks

查看详情 http://msdn.microsoft.com/en-us/library/system.datetime.ticks(v=vs.110).aspx

【讨论】:

  • 他没有提到任何关于在问题中寻找唯一数字的内容。
  • 这正是我来这里寻找的,谢谢。
  • Millis 自 0001 年 1 月 1 日起 Dim millisNow = DateTime.UtcNow.Ticks / 10000
  • 在我的例子中,对 DateTime.Now.Ticks 的非常快速的连续调用仍然产生相同的数字,但我用一个包装函数进行补偿,如果它返回
  • DateTime.Now 提供系统本地时区的时间;使用 Ticks 的值 not 等同于 System.currentTimeMillis() ,它返回自 Unix 纪元以来经过的时间 - 即它对系统时区 not 敏感。使用 DateTime.UtcNow 会更好,但现在有一个更简单的替代方案 - 有关详细信息,请参阅我的答案。
【解决方案6】:
    Dim myTime As DateTime = DateTime.Now
    MessageBox.Show(myTime.Millisecond)

【讨论】:

  • 错误的抱歉! DateTime.Now.Millisecond 只是自上一秒翻转以来的毫秒数,所以不是正确的答案(并且在时间循环中出现了可怕的错误,因为我发现很难方式)。
  • DateTime.Now 提供系统本地时区的时间;使用 Ticks 的值 not 等同于 System.currentTimeMillis() ,它返回自 Unix 纪元以来经过的时间 - 即它对系统时区敏感。使用 DateTime.UtcNow 会更好(尽管 www-0av-Com 的观点仍然成立),但现在有一个更简单的替代方案 - 有关详细信息,请参阅我的答案。
【解决方案7】:

简单地说DateTime.Now.Ticks / 10000

这是对所提出的简单问题的最直接的答案,并且被证明是 Java 的 System.currentTimeMillis() 的直接替代品,假设它需要测量经过的时间(因为它从 1 月 1 日开始运行, 0001,而 Java 从 1970 年 1 月 1 日开始运行)。

注意事项:

  • DateTime.Now.Ticks 是每毫秒 10,000 个滴答声,但测试表明它的分辨率大约为 1 毫秒。
  • 注:DateTime.Now.Millisecond 只是自上一秒翻转以来的毫秒数,因此在大多数计时中没有用 测量。

【讨论】:

  • DateTime.Now.Ticks 不会给出自任何固定纪元以来经过的时间,因为它处于 local 时间。例如,当时钟由于夏令时更改而返回时,DateTime.Now.Ticks 将给出比以前更低的数字。将其与 System.currentTimeMillis() 进行比较,它给出了自 Unix 纪元以来经过的时间,这是一个固定的时间瞬间。使用 DateTime.UtcNow.Ticks,以及展示如何将其偏移到 Unix 纪元并将其缩放到毫秒,将是 true 直接替代 System.currentTimeMillis()
【解决方案8】:

以毫秒为单位获取当前日期和时间

Dim Time1 as String = DateTime.Now.ToString("MM/dd/yyyy hh:mm:ss.fff tt")*

.fff tt 将为您提供当前日期和时间的毫秒数。

【讨论】:

  • 这不是 OP 想要的以毫秒为单位的结果 - 他们想要“自 Unix 纪元以来的毫秒数”,正如 Java 中的 System.currentTimeMillis() 返回的那样。
猜你喜欢
  • 2017-04-25
  • 1970-01-01
  • 1970-01-01
  • 2011-05-10
  • 2015-12-28
  • 1970-01-01
  • 2011-10-25
相关资源
最近更新 更多