如何用C语言输出Excel可识别的日期时间以实现快速绘图打印
让C语言输出Excel可识别的日期时间数值格式,直接用于温度数据绘图
问题背景
我用C代码每分钟记录机房温度到文本文件,希望直接在Excel中选列快速绘图,但当前输出的YYYY-MM-DD HH:MM:SS文本格式无法被Excel识别为X轴日期时间,必须借助中间列转换。现有输出格式和核心代码如下:
输出格式示例:
Date Time SystemBoardInletTemp°F SystemBoardExhaustTemp°F 2022-10-13 13:17:01 66 84 2022-10-13 13:18:01 66 84
核心日期时间输出代码:
time_t epoch; struct tm tm; epoch = time( NULL ); tm = *localtime( &epoch ); printf( "%d-%02d-%02d", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday ); printf( " %02d:%02d:%02d", tm.tm_hour, tm.tm_min, tm.tm_sec);
解决方案:输出Excel的日期时间浮点数格式
Excel将日期时间存储为浮点数:
- 整数部分:从1900年1月1日到目标日期的天数
- 小数部分:当天时间占全天的比例(如12:00:00对应0.5)
方法1:基于Epoch时间快速计算
Epoch时间是1970年1月1日00:00:00以来的秒数,已知Excel中1970-01-01对应的数值是25569,直接通过以下公式转换:
Excel日期值 = 25569 + (Epoch秒数 / 86400.0)
(86400是一天的秒数:246060)
修改后的代码:
time_t epoch = time(NULL); // 计算Excel日期时间数值 double excel_datetime = 25569.0 + (double)epoch / 86400.0; // 输出时将日期时间合并为一列,方便Excel识别 printf("%.6f", excel_datetime);
方法2:基于struct tm精确计算(不依赖Epoch)
如果需要直接从struct tm计算,需手动累加年份天数、当年天数,并加上时间占比:
time_t epoch = time(NULL); struct tm tm = *localtime(&epoch); // 计算从1900年到当前年份前一年的总天数(含闰年) int total_days = 0; for (int year = 1900; year < tm.tm_year + 1900; year++) { total_days += (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)) ? 366 : 365; } // 计算当年已过的天数(tm_yday从0开始,所以加1) total_days += tm.tm_yday + 1; // 计算当天时间的小数部分:(小时*3600 + 分钟*60 + 秒) / 86400 double time_fraction = (tm.tm_hour * 3600.0 + tm.tm_min * 60.0 + tm.tm_sec) / 86400.0; // 合并为Excel日期时间数值 double excel_datetime = total_days + time_fraction; printf("%.6f", excel_datetime);
修改后的输出示例
调整列标题为合并的DateTime列,输出格式如下:
DateTime SystemBoardInletTemp°F SystemBoardExhaustTemp°F 44833.553426 66 84 44833.554167 66 84
使用说明
- Excel打开文本文件时,会自动识别该浮列为数值格式,手动设置单元格格式为「日期时间」即可显示为可读格式
- 直接选中DateTime列和温度列,即可生成带正确时间轴的图表,无需中间转换列
内容的提问来源于stack exchange,提问作者ron
相关产品推荐
相关产品推荐

