5

我有一个日期时间字段,例如

{01/01/0001 00:01:02} 

毫秒 = 30 并且上述日期时间字段的刻度是

6203000000

刻度在数据库中保存为 int 值,即 62030。我需要使用数据库中的值 (62030) 重现上述日期时间。所以我尝试了以下方法。

var data = 62030;
winTime = new DateTime().AddTicks(Convert.ToInt64(data.ToString().PadRight(10, '0')));
var b = winTime.Ticks;

var b = 6203000000。但它返回分钟为 10 而不是 01,秒为 20 而不是 02,毫秒为 300 而不是 030。

谁能看到我做错了什么?

4

2 回答 2

8

在我看来,您的“滴答声 62030”实际上是“毫秒 62030”,在这种情况下它非常简单 - 您只需乘以“每毫秒滴答声的数量”,即 10,000。您根本不需要为此使用DateTime

// Note that if you want any significant length of time, you'd expect to get
// the data as a long, not an int
int data = 62030; // Milliseconds
long ticks = data * 10000L;

...而且您当然不需要字符串转换。转换为字符串、填充,然后再次转换回来是一种非常曲折且容易出错的乘法运算方式。

或者,如果您确实需要DateTime

int data = 62030; // Milliseconds
long dateTime = new DateTime(data * 10000L);

我强烈怀疑任何DateTime早期的价值实际上都应该被视为TimeSpan虽然 - 这真正意味着什么?如果是这样,那就更容易了:

TimeSpan ts = TimeSpan.FromMilliseconds(data);

日期和时间概念很容易混淆,最终会出现一些非常微妙的错误。我个人建议使用我的Noda Time项目,它比 .NET 更能区分它们,但即使您不使用该库,也值得查看概念列表,以便您也可以在 .NET 中适当地考虑它们。

于 2013-06-19T10:45:50.490 回答
5

为什么不只使用DateTime接受Int64表示刻度的构造函数,例如:

var dateTimeFromTicks = new DateTime(ticks);
于 2013-06-19T10:45:45.513 回答