【问题标题】:Get Milliseconds from Ticks in DateTime c# [duplicate]从DateTime c#中的刻度获取毫秒[重复]
【发布时间】:2021-03-19 01:09:09
【问题描述】:

我有一个简单的 DateTime 对象,等于日期:11/1/2020 8:11:14 AM

我想将它转换为毫秒,所以我这样做: myTimestamp?.Ticks / TimeSpan.TicksPerMillisecond.

我得到了63739786274788,从纯计算的角度来看,这似乎是正确的。

但是,当我将其输入到online converters 之一进行验证时,我得到的日期是Wed Nov 01 3989 01:11:14,这当然是遥不可及的。

问题:

  1. 如果不是以毫秒为单位的时间,63739786274788 这个数字是多少?
  2. 如何获得以毫秒为单位的“正常”时间戳?

【问题讨论】:

  • 有三个开始时间 1) 1/1/01 2) 1/1/1900 3) 1/1/1970 你有哪一个?
  • 您提到DateTimeTimeStamp,转换为毫秒但拒绝使用DateTime.TotalMilliseconds 以及一些关于DateTime 内部的随机假设。你能把你的想法整理好,然后问你需要问什么吗?
  • @Blindy - TotalMilliseconds 不是 DateTime 的属性。你可能会想到TimeSpan,这是不一样的。

标签: c# datetime timestamp unix-timestamp


【解决方案1】:

在 .NET 中,DateTime 刻度基于 0001-01-01T00:00:00.0000000 的纪元。 .Kind 属性用于决定是 UTC、当地时间还是“未指定”。

大多数在线转换器(例如您链接到的转换器)都期望Unix Timestamp,其中的值基于1970-01-01T00:00:00.000Z 的纪元。它始终基于 UTC。 (精度不同,常用秒和毫秒。)

如果您想从 .NET 获取基于毫秒的 Unix 时间戳,您应该使用内置函数 DateTimeOffset.FromUnixTimeMillisecondsDateTimeOffset.ToUnixTimeMilliseconds 而不是除法。 (这些函数也有基于秒的版本。)

假设您的输入值基于 UTC:

DateTime dt = new DateTime(2020, 11, 1, 8, 11, 14, DateTimeKind.Utc);
DateTimeOffset dto = new DateTimeOffset(dt);
long timestamp = dto.ToUnixTimeMilliseconds();

// output:  1604218274000

DateTimeKind.Local 也适用于此,假设您的值确实基于计算机的本地时区。 DateTimeKind.Unspecified 有点棘手,因为您需要先使用TimeZoneInfo 转换为具有特定时区的DateTimeOffset

你也可以直接构造DateTimeOffset的值,而不是通过DateTime

【讨论】:

    【解决方案2】:

    好的,所以你开始将 Ticks 除以 TicksPerMillisecond (10,000)

    如您所见,您生成的数字远大于当前毫秒数:

    63739786274788

    1607363529803

    简短的回答是,Ticks 基于 0001 年 1 月 1 日午夜 12:00:00,而您的在线计算器基于 1970 年 1 月 1 日的 unix 时间。所以这可以解释为什么您大约是 2,000年假。如果你从一个新的 DateTime(1970,1,1) 中减去 Ticks,那么你就会得到一个合适的数字来满足在线计算器的要求。

    更多信息,我建议阅读MS's docs on DateTime

    【讨论】:

      猜你喜欢
      • 2021-06-06
      • 2016-05-22
      • 1970-01-01
      • 1970-01-01
      • 2014-08-07
      • 1970-01-01
      • 2020-07-16
      • 2013-07-28
      • 1970-01-01
      相关资源
      最近更新 更多