今天写一小程序用来分析某Excel报表,结果在处理日期的时候蛋疼了。

原Excel是这样的:

Excel加载到DataTable以后,日期都变成了这个样子:

看起来很像某偏移量。当然也有一部分日期是正常的:

我尝试用DateTime.Parse直接匹配,结果爆掉了。于是查了下MSDN找到了正确的办法:DateTime.FromOADate(double d) 方法:

d 参数是一个双精度浮点数字,它将日期表示为基础日期(1899 年 12 月 30 日午夜)之前或之后的天数。 d 的符号和整数部分将日期编码为相对于 1899 年 12 月 30 日的正负日偏移量,而 d 的小数部分的绝对值将当天的时间编码为相对于午夜的小数日偏移量。d 必须为负 657435.0 到正 2958466.0 之间的值。

根据我的Excel,我封装了一下转换函数,如下:

private DateTime ConvertExcelDateTimeIntoCLRDateTime(object value)
{
    if (value is DateTime)
    {
        return DateTime.Parse(value.ToString());
    }
    else
    {
        string dt = DateTime.FromOADate(Convert.ToInt32(value)).ToString("d");
        return DateTime.Parse(dt);
    }
}

这个函数首先判断日期是否能直接转换,因为我需要处理上图中F12列这样的日期。如果不能识别,就调用FromOADate(),将偏移量转换为日期。

于是就OK了,有图有真相: