NateTimes to DateTimeOffset

问题描述 投票:-1回答:1

我正在使用.Net版本4.6,并且正在使用DateTimeOffset.FromUnixTimeMilliseconds将纳秒转换为DateTimeOffset。

long j = 1580122686878258600;
var X = DateTimeOffset.FromUnixTimeMilliseconds(Convert.ToInt64(j * 0.000001));

[我将纳秒存储为long,仍然要转换为Int64,同时乘以0.000001以将纳秒转换为毫秒。

还有其他更好的方法吗?

c# .net-4.6
1个回答
0
投票

是,如果您不想再次将其转换为(long),则可以用1000000除而不是乘以0.000001

但是如果需要多个,则不需要,在这种情况下,必须将longdouble的乘积转换回long。首先,值0.000001的类型为double。第二,对于这两种类型的乘法,编译器将暗示longdouble的转换,结果也将是double。进行隐式转换的原因是,转换回long时会损失精度(小数位)。方法DateTimeOffset.FromUnixTimeMilliseconds()仅接受单个long参数(long和Int64是相同的数据类型,long只是Int64的别名),因此您必须将结果转换回去。

[除以1000000的情况下,仍将除以两个long的值会导致除,但是任何小数位都会被截断。

在两种情况下,如果需要,您可能需要考虑舍入和精度损失的影响。如果使用1580122686878999999的纳米值,则会得到不同的值。对于longdouble(即(long)(1580122686878999999 * 0.000001))的相乘,结果为1580122686879。但是使用long的除法,您得到的却是1580122686878

我对实现也有一些评论,提供了一些替代方案:

如果您不喜欢Convert.ToInt64()表示法/调用本身,则可以使用标准的强制转换(即(long)(j * 0.000001))。如果您不喜欢这样做,则可以使用接受“滴答”的构造函数来构造DateTimeOffset,您可以从具有TimeSpan方法的FromMilliseconds()结构中获得,该结构具有接受double的方法,(例如new DateTimeOffset(TimeSpan.FromMilliseconds(j * 0.000001).Ticks, TimeSpan.Zero))。但是,强制转换似乎是最简单明了的代码。

[进一步,在上面的“ ticks”构造函数上进行扩展,最好的解决方案可能是改为划分为“ ticks”,该精度为100纳秒,比毫秒更精确。在这种情况下,您可以通过将纳秒除以100(乘以0.01)来获得“滴答”,从而获得更高的精度,例如new DateTimeOffset((long)(j * 0.01), TimeSpan.Zero)。我仅出于这样的想法,您可能希望从初始的纳秒值中获得尽可能最高的精度。

© www.soinside.com 2019 - 2024. All rights reserved.