我有一个像
这样的日期时间字段{01/01/0001 00:01:02}
毫秒= 30,上述日期时间字段的刻度为
6203000000
ticks在数据库中保存为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。
谁能看到我做错了什么?
答案 0 :(得分:8)
在我看来,你的“ticks 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更多,但即使你不使用该库,也值得查看list of concepts,这样你就可以适当地考虑它们了。 .NET也是。
答案 1 :(得分:4)
为什么不使用接受表示刻度的DateTime
的{{1}}构造函数,例如:
Int64