从 DateTime c# 中的 Ticks 获取毫秒数

Get Milliseconds from Ticks in DateTime c#

我有一个简单的 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. 如何获得以毫秒为单位的“正常”时间戳?

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

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

如果您想从 .NET 中获取基于毫秒的 Unix 时间戳,您应该使用内置函数 DateTimeOffset.FromUnixTimeMilliseconds and DateTimeOffset.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

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

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

63739786274788

1607363529803

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

有关更多信息,我建议通读 MS's docs on DateTime