我有一个像这样的日期时间字段
{01/01/0001 00:01:02}
毫秒 = 30 并且上述日期时间字段的刻度为
6203000000
刻度在数据库中保存为一个整数值,即 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。
谁能看出我做错了什么?
最佳答案
在我看来,您的“ticks 62030”实际上是“milliseconds 62030”,在这种情况下它非常简单 - 您只需要乘以“每毫秒的 ticks 数”,即 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 更能将它们分开的项目,但即使您不使用该库,也值得查看 list of concepts因此您也可以在 .NET 中适本地考虑它们。
关于c# 从滴答中重现日期时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17189149/