将Double转换为Datetime,包括毫秒

时间:2014-03-27 14:03:20

标签: c# visual-studio-2010 datetime type-conversion

我正在编写一个解析器,并且遇到了一个我无法解决的问题。我有一个数字(双)734139.045000000040存在于一个文本文件中,这是日期。我需要将此数字转换为DateTime格式(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 请帮忙!谢谢你

3 个答案:

答案 0 :(得分:4)

快速计算显示,734,139天的工作时间约为2,011年和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

似乎工作。

我通过反复试验来解决这个问题。最初的假设是该数字是某个基值的偏移量,通常称为纪元日期。通常,偏移量是毫秒,秒或天数。我认为偏移值更有可能以天为单位表示,原因有两个:

  1. 偏移很小。如果它是秒,它将是8.5天,如果它是毫秒,那将是大约12小时。
  2. 使用double来表示毫秒数是不寻常的,并且表达几秒钟几乎同样罕见。通常,您将秒或毫秒表示为long。这不是普遍的,但在我的经历中最常见。
  3. 所以,考虑到这几天,我将365除以得到一个快速估计,发现它大约是2011年。这符合您的评论,即日期应该是“2010年末或2011年”。

    更新

    如果您想获得毫秒数,可以将其视为TimeSpan

    var ts = TimeSpan.FromDays(days);
    var millis = ts.TotalMilliseconds;
    

答案 1 :(得分:2)

如果值是" 一个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开始。

答案 2 :(得分:0)

也许你在这里使用了错误的方法。根据有关FromOADate的文档:

  

d参数是一个双精度浮点数,表示日期为基准日期之前或之后的天数,即1899年12月30日午夜.d的符号和整数部分将日期编码为正数或者从1899年12月30日开始的负日间位移,并且d的小数部分的绝对值将一天中的时间编码为从午夜开始的一天的一小部分。 d必须是负值657435.0到正数2958465.99999999之间的值。

该数字实际上以毫秒为单位的可能性更大。如果这符合您的需求,那么您可以使用following DateTime constructor

  

DateTime conv = new DateTime((long)d);

这里d表示

  

日期和时间,以公历1月1日(公元01年1月1日00:00:00.000)开始的100纳秒间隔数表示。

您需要测试并告诉我们这是否符合您的需求(或不符合您的需求),以便为您提供进一步有用的信息。