【发布时间】:2015-09-28 12:08:01
【问题描述】:
我需要将 unix TimeStamp 转换为 .Net DateTIme 值,反之亦然。 这没问题,但我需要将转换后的值存储为 Int64(这意味着我会丢失小数位)。
丢失小数位意味着我可以得到原始值和转换值之间的差异。 如果可以的话,我会更改实现并将值存储为 Double 而不是 Int64……但遗憾的是我不能(规范等)。
编辑: 我需要将值存储为 Int64,表示自 1970 年以来的秒数(unix 时间戳)
我想我已经找到了解决这个问题的方法,但我不确定它是否 100% 有效。 (它在我的测试中 100% 有效)。在转换为 int 接缝之前将 Double 值四舍五入以解决问题。
这能解决问题吗?
这是我的代码:
[Test]
public void ConvertTest()
{
const Int64 orignalUnixValue = 252000596321;
var referenceTimeZero = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
//Test 1
var convertedDateTime = referenceTimeZero.AddSeconds(orignalUnixValue);
var convertedUnixValue = (convertedDateTime - referenceTimeZero).TotalSeconds;
var convertedDateTime2 = referenceTimeZero.AddSeconds(convertedUnixValue);
//This works
convertedDateTime2.Should()
.Be( convertedDateTime );
//Test 2
convertedDateTime = referenceTimeZero.AddSeconds(orignalUnixValue);
var convertedUnixValueCasted = (Int64)(convertedDateTime - referenceTimeZero).TotalSeconds;
convertedDateTime2 = referenceTimeZero.AddSeconds(convertedUnixValueCasted);
//Difference of 1 second
convertedDateTime2.Should()
.Be(convertedDateTime);
//Test 3
convertedDateTime = referenceTimeZero.AddSeconds(orignalUnixValue);
convertedUnixValueCasted = (Int64)Math.Ceiling((convertedDateTime - referenceTimeZero).TotalSeconds);
convertedDateTime2 = referenceTimeZero.AddSeconds(convertedUnixValueCasted);
//Possible workaround - works for this example
convertedDateTime2.Should()
.Be(convertedDateTime);
}
第一个测试显示转换值的正确方法,第二个显示当前实现,第三个包含我的解决方法。
【问题讨论】:
-
听起来你的问题应该是“在 DateTime 和 Int64 之间转换而不会丢失信息”。 unix 时间戳部分听起来无关紧要......
-
我们来谈谈您的业务需求。在您的时间戳/日期时间数据的生命周期内,它是否可以在任何时候包含重要且不应丢失的小数位/秒的分数?
-
@Jon Skeet 也许这是一个更好的标题。
-
@musium 这不是你可以失去的秒数。它是由 UNIX 时间戳的小数部分表示的秒的小数部分。
-
@musium:那应该是问题所在。您目前说过“这没问题,但我需要将转换后的值存储为 Int64”——这就是我的建议。目前还不清楚要求是什么(至少对我而言)——尤其是在您是否需要任何亚秒级值方面。
标签: c# datetime unix-timestamp