我正在使用.Net版本4.6,并且正在使用DateTimeOffset.FromUnixTimeMilliseconds
将纳秒转换为DateTimeOffset。
long j = 1580122686878258600;
var X = DateTimeOffset.FromUnixTimeMilliseconds(Convert.ToInt64(j * 0.000001));
[我将纳秒存储为long
,仍然要转换为Int64
,同时乘以0.000001以将纳秒转换为毫秒。
还有其他更好的方法吗?
是,如果您不想再次将其转换为(long),则可以用1000000
除而不是乘以0.000001
。
但是如果需要多个,则不需要,在这种情况下,必须将long
和double
的乘积转换回long
。首先,值0.000001
的类型为double
。第二,对于这两种类型的乘法,编译器将暗示long
到double
的转换,结果也将是double
。进行隐式转换的原因是,转换回long
时会损失精度(小数位)。方法DateTimeOffset.FromUnixTimeMilliseconds()
仅接受单个long
参数(long和Int64是相同的数据类型,long只是Int64的别名),因此您必须将结果转换回去。
[除以1000000
的情况下,仍将除以两个long
的值会导致除,但是任何小数位都会被截断。
在两种情况下,如果需要,您可能需要考虑舍入和精度损失的影响。如果使用1580122686878999999
的纳米值,则会得到不同的值。对于long
和double
(即(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)
。我仅出于这样的想法,您可能希望从初始的纳秒值中获得尽可能最高的精度。