我发现DateTime转换为long,反之亦然.在测试转换后,我发现它们有时会提供与原始时间相差一秒的结果.这是一个Minimal,Complete和Verifiable示例
public static class DateTimeConstants
{
public static readonly DateTime ZeroTime =
new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
}
public static class DateTimeExtensions
{
public static long ToLong(this DateTime value)
{
return Convert.ToInt64((value.ToUniversalTime() -
ZeroTime).TotalSeconds)
}
}
public static class LongExtensions
{
public static DateTime ToDateTime(this long value)
{
var dateTime = ZeroTime.AddSeconds(value);
return dateTime.ToLocalTime();
}
}
public void ConvertDateTimeToLongAndBackTest()
{
var initialDateTime = DateTime.Now;
var longDateTime = initialDateTime.ToLong();
var result = longDateTime.ToDateTime();
Assert.AreEqual(result.Date, initialDateTime.Date);
Assert.AreEqual(result.Hour, initialDateTime.Hour);
Assert.AreEqual(result.Minute, initialDateTime.Minute);
// Fails on the following line sometimes
Assert.AreEqual(result.Second, initialDateTime.Second);
}
Run Code Online (Sandbox Code Playgroud)
有时,生成的DateTime与我为测试实例化的原始DateTime相同,但有时会关闭一秒钟.为什么是这样?
好吧,因为你缩短了秒数,很明显你可以失去一秒精度.例如,12.8 seconds可能会打印出13舍入,但您的算法将其转换为12.如果你不使用相同的舍入,即使使用舍入也可能会遇到麻烦.
编辑:既然你已经实际添加了你的代码,我可以更具体 - DateTime.Second截断当前秒,同时Convert.ToInt64舍入它.所以12.8秒,你将获得第二个13而不是原来的12.修复很简单 - 用简单的强制转换替换转换.或者,如果您无法更改格式(即某人已经依赖于错误行为),请在日期时间内将测试更改为向上秒.
如果您想要unix时间,请使用unix时间.如果要使用二进制格式进行持久化,请使用ToBinary.不要试图制作自己的日期时间格式,日期不是简单的.
| 归档时间: |
|
| 查看次数: |
155 次 |
| 最近记录: |