.net 中读取 Excel 中的日期数据

        static readonly DateTime march1st1900 = new DateTime(1900, 03, 01);
        static readonly DateTime december31st1899 = new DateTime(1899, 12, 31);
        static readonly DateTime january1st1904 = new DateTime(1904, 01, 01);
        static readonly TimeSpan date1904adjustment = new TimeSpan(4 * 365 + 2, 0, 0, 0, 0);
        static readonly TimeSpan before1stMarchAdjustment = new TimeSpan(1, 0, 0, 0);
        bool date1904 = ActiveWorkbook.Date1904;

        object ConvertDateToExcelDate(DateTime date)
        {
            if (date1904)
            {
                if (date >= january1st1904)
                    return date - date1904adjustment;
                else
                    return date.ToString(DateFormat, DateFormatProvider);
            }
            if (date >= march1st1900)
                return date;
            if (date < march1st1900 && date > december31st1899)
                return date - before1stMarchAdjustment;
            return date.ToString(DateFormat, DateFormatProvider);
        }


        DateTime ConvertExcelDateToDate(object excelDate)
        {
            DateTime date = (DateTime)excelDate;
            if (Date1904)
                return date + date1904adjustment;
            if (date < march1st1900)
                return date + before1stMarchAdjustment;
            return date;
        }

 

-------------------------------------------------------------------------------------

 

 

从EXCEL中读取文本,数值型数据都很简单,EXCEL没有做其他转换,
可是读取日期数据就出现了一个问题:
EXCEL保存日期数据实际上存放的是时间戳,从1900年开始算起。
也就是说 1900-1-1 在EXCEL中表示为 1 。
OK,明白了这个原理之后就可以开始操作了 :

 void Button1Click(object sender, EventArgs e)
{
 DateTime march1st1900 = new DateTime(1900, 03, 01);
 DateTime december31st1899 = new DateTime(1899, 12, 31);
 TimeSpan after1stMarchAdjustment = new TimeSpan(1, 0, 0, 0);
 
 TimeSpan ts = TimeSpan.Parse("40504");
      DateTime dt = december31st1899+ts;
      if (dt >= march1st1900)
      {
            dt = dt - after1stMarchAdjustment;
       }
      MessageBox.Show( Convert.ToString(dt));
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值