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

std::get_time解析%y与%Y均读取四位年份是使用错误还是bug

结论

这不是std::get_time的函数bug,是Linux环境下glibc标准库对%y格式符的非标准扩展实现导致的行为。

格式符标准语义

std::get_time的格式规则继承自C标准的strptime函数,标准定义的两个年份格式符行为如下:

  • %y:匹配最多2位十进制数字,代表年份的后两位,默认映射到19702069区间(0069对应20002069,7099对应1970~1999),最终tm.tm_year的取值为读取到的数值+1900或+2000
  • %Y:匹配最多4位十进制数字,代表完整的公元年份,tm.tm_year的取值为读取到的数值-1900
异常行为原因

std::get_time在glibc的标准库实现中,底层直接调用C标准库的strptime完成解析。而glibc的strptime实现对%y做了兼容扩展:如果%y对应的输入位置有超过2位的连续合法数字,会忽略2位长度限制,读取全部连续数字作为年份值,这才导致你测试时%y和%Y表现一致。
你如果在Windows MSVC等其他标准库环境下运行同一份代码,%y会严格遵循2位长度限制,就能看到和%Y的差异。

规避方案

如果需要强制%y只读取2位年份,避免吞掉后续的月、日数字,可以用两种方式处理:

  • 给输入的日期字符串加上分隔符,比如10-11-12,格式串对应改为%y-%m-%d,就不会出现多读取数字的问题
  • 手动拆分输入字符串,先截取前2位作为年份,剩下的部分再单独解析月、日

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 20:06:01