我有一个简单的 DateTime 对象,等于日期:11/1/2020 8:11:14 AM
。
我想将它转换为毫秒,所以我这样做:
myTimestamp?.Ticks/TimeSpan.TicksPerMillisecond
。
我得到 63739786274788
,从纯计算的角度来看这似乎是正确的。
但是,当我将它输入到 online converters 之一时为了进行验证,我得到了日期 Wed Nov 01 3989 01:11:14
,这当然有点不对。
问题:
- 如果不是以毫秒为单位的时间,这个数字
63739786274788
是多少?
- 如何获得以毫秒为单位的“正常”时间戳?
在 .NET 中,DateTime
刻度基于 0001-01-01T00:00:00.0000000
的纪元. .Kind
属性用于决定是 UTC、本地时间还是“未指定”。
大多数在线转换器,例如您链接到的那个,都期待一个 Unix Timestamp ,其中值基于 1970-01-01T00:00:00.000Z
的纪元.它始终基于 UTC。 (精度各不相同,常用秒和毫秒。)
如果你想从 .NET 中获取基于毫秒的 Unix 时间戳,你应该使用内置函数 DateTimeOffset.FromUnixTimeMilliseconds
而不是除法。和 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
有点棘手,因为您需要转换为 DateTimeOffset
使用 TimeZoneInfo
的特定时区首先。
您还可以构造 DateTimeOffset
直接赋值,而不是通过DateTime
完全没有。