You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用XLNT导入Excel日期时间至C++时数值转换问题咨询

嘿,这个问题其实是Excel本身的日期时间存储逻辑导致的,不是XLNT的问题哦!让我给你拆解清楚:

为什么Excel日期时间会被解析成数字?

Excel底层是用**序列号(serial number)**来存储所有日期和时间的,这个机制是微软从Lotus 1-2-3继承来的,核心规则很简单:

  • 整数部分对应日期:以1900年1月1日作为基准日(序列号=1),每往后过一天,序列号就加1。
  • 小数部分对应时间:把一整天24小时看作数值1,所以1小时就是1/24≈0.041667,1分钟是1/(24*60)≈0.000694,以此类推。

你的两个例子推导逻辑

1. 2/21/2019 → 43517

从1900年1月1日到2019年2月21日的总天数刚好是43517。你可以在Excel里输入公式验证:=DATE(2019,2,21)-DATE(1900,1,1)+1,结果就是这个数字(因为1900/1/1本身算第1天)。

2. 5:30:00 → 0.229167

5小时30分钟等于5.5小时,用5.5除以24,得到的结果就是5.5/24≈0.229167,完全匹配你拿到的小数。

在XLNT中转换回可读的日期时间

XLNT已经帮你封装好了处理这个转换的工具,不用自己手动计算:
如果你的单元格读取的是序列号数值,可以用xlnt::datetime的静态方法转换:

// 假设你从单元格读取到了这个序列号
double serial_number = cell.value<double>();
xlnt::datetime dt = xlnt::datetime::from_serial(serial_number);

// 之后就能直接获取各个时间分量了
int year = dt.year();
int month = dt.month();
int day = dt.day();
int hour = dt.hour();
int minute = dt.minute();

更方便的是,如果单元格本身被Excel标记为日期时间格式,你可以直接读取为xlnt::datetime类型,跳过手动转序列号的步骤:

xlnt::datetime dt = cell.value<xlnt::datetime>();

这样就能得到符合预期的日期时间数据啦!

内容的提问来源于stack exchange,提问作者ark1974

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:44:57