我正在编写一个解析器,并且遇到了一个我一直无法解决的问题。我有一个数字(双)734139.045000000040存在于文本文件中,这是日期。我需要把这个数字转换成日期时间格式(yyyy-mm-dd HH:mm:ss.fff)。
我有以下代码,它给了我一个遥远的未来的日期,绝对是错误的,我想知道我需要做什么才能得到正确的日期。不幸的是,我没有应有的dateTime值,我只知道这个文件是在2010年底或2011年的某个时候生成的。
如果有任何帮助或指导,我将非常感谢。
double d = double.Parse(line);
DateTime conv = DateTime.FromOADate(d);
MessageBox.Show(conv.ToString());
结果消息框显示转换为01/01/3910 01:04:48请帮助!谢谢你
快速计算表明,734,139天约为2011年零4个月。这还没有考虑闰年的因素。因此,我怀疑1.0意味着有一天。我们看一下:
var days = 734139.045000000040;
var theDate = new DateTime(1, 1, 1).AddDays(days);
Console.WriteLine(theDate);
输出是:
2011/01/03 01:04:48
似乎有效。
我通过反复试验得出了这个结论。最初的假设是,这个数字是某个基本值(通常称为历元日期)的偏移量。通常,偏移量是毫秒数、秒数或天数。我认为偏移值更可能以天为单位表示,原因有二:
- 偏移量非常小。如果是秒,那就是8.5天;如果是毫秒,那就是12小时。
- 用
double
来表示毫秒数是不寻常的,用它来表示秒数也是不寻常的。通常你会用long
来表示秒或毫秒。这并不是普遍正确的,但在我的经验中是最常见的。
所以,算出它是天数,我除以365来快速估计,发现它大约是2011年。这符合你的评论,日期应该在"2010年底或2011年"。
更新如果您想获得毫秒数,您可以将其视为TimeSpan
:
var ts = TimeSpan.FromDays(days);
var millis = ts.TotalMilliseconds;
如果值为" matlab串行日期号",如您在您的评论之一中提到的,使用以下命令来解析它:
DateTime conv = new DateTime(1, 1, 1).AddDays(734139.045000000040).AddYears(-1)
结果:1/3/2010 1:04:48 AM.
将以天为单位的值与日期0001/01/01相加,然后减去一年。原因是。net从0001/01/01开始,而Matlab从0000/00/00开始。
也许你在这里使用了错误的方法。根据关于FromOADate的文档:
d形参是一个双精度浮点数,表示日期为基日(1899年12月30日午夜)之前或之后的天数。d的符号和积分部分将日期编码为从1899年12月30日开始的正负日位移,d的小数部分的绝对值将一天中的时间编码为从午夜开始的日位移的小数。D必须在负657435.0到正2958465.99999999之间。
这个数字更有可能是以毫秒为单位的。如果这符合您的需要,那么您可以使用以下DateTime构造函数:
DateTime conv = new DateTime((long)d);
这里d表示
从公历0001年1月1日00:00:00.000开始,以100纳秒间隔数表示的日期和时间。
您需要测试并告诉我们是否符合您的需求(或如何不符合您的需求),以便为您提供进一步有用的信息。