C#中如何将Excel返回的日期数字字符串(如44165)转为DateTime?
C# 转换Excel日期序列号为DateTime
你拿到的"44165"是Excel的日期序列号——Excel会把日期存储为从1900年1月1日开始累计的天数(注意Excel有个历史bug:错误地将1900年判定为闰年,导致序列号>=60时需要修正)。直接用Convert.ToDateTime这类方法当然会报错,因为它们是用来解析日期格式字符串的,而非数字序列号。
直接用C#手动转换的代码如下:
// 你的Excel日期序列号字符串 string excelDateSerialStr = "44165"; if (double.TryParse(excelDateSerialStr, out double excelSerial)) { // Excel Windows版的基准日期 DateTime excelBase = new DateTime(1900, 1, 1); // 修正1900年闰年bug:Excel认为1900年有2月29日,实际没有,所以序列号>=60时要减1天 if (excelSerial >= 60) { excelSerial -= 1; } // 计算最终日期:基准日期加上(序列号-1)天,因为Excel把1900-01-01算作序列号1 DateTime targetDate = excelBase.AddDays(excelSerial - 1); // 输出结果:2021-11-30 Console.WriteLine(targetDate.ToString("yyyy-MM-dd")); } else { // 处理转换失败的情况,比如输入不是有效数字 Console.WriteLine("输入的不是有效的Excel日期序列号"); }
补充说明
如果是Mac版Excel,基准日期是1904年1月1日,此时只需把excelBase改成new DateTime(1904, 1, 1),并且不需要处理1900年的bug(Mac版Excel没有这个问题)。
内容的提问来源于stack exchange,提问作者Daniel Ilie
相关产品推荐
相关产品推荐

