如何解析由CRT库wcsftime函数%x格式生成的日期字符串
方案1:直接用配对的时间解析函数
MSVC 提供了和 wcsftime 配对的 wcsptime 函数,支持完全相同的格式化符规则,不需要单独获取格式串,直接传入 %x 作为格式参数即可自动适配当前CRT区域设置解析日期:
#include <ctime> #include <cwchar> // 解析%x格式的宽字符日期串 bool parse_crt_short_date(const wchar_t* date_str, struct tm* out_tm) { memset(out_tm, 0, sizeof(struct tm)); const wchar_t* parse_end = wcsptime(date_str, L"%x", out_tm); // 确保整个串都被成功解析 return parse_end != nullptr && *parse_end == L'\0'; }
方案2:获取当前CRT区域对应的显式日期格式串
如果你需要拿到类似 dd-MM-yyyy 的格式串做自定义处理,可以用CRT自带的 _getlocaleinfo 接口,这个接口返回的信息完全对应CRT的区域设置,和Windows系统API的GetLocaleInfo相互独立:
#include <clocale> #include <cwchar> wchar_t crt_short_date_format[256] = {0}; // 获取当前CRT区域的短日期格式(即%x对应的格式) int ret = _getlocaleinfo(LC_ALL, LOCALE_SSHORTDATE, crt_short_date_format, _countof(crt_short_date_format)); if (ret > 0) { // 拿到的格式串可用于自定义解析、日志输出等场景 }
注意事项
- 生成文件名和解析文件名的流程必须使用相同的CRT区域设置,否则会出现解析不匹配的问题。
- 多线程场景下建议用
_create_locale显式创建固定的区域对象,调用wcsftime_l、wcsptime_l这类带区域参数的函数,避免其他线程修改全局区域设置导致异常。 - 如果你使用的MSVC版本过旧不支持
wcsptime,可以用方案2拿到格式串后自己实现简单的拆分解析逻辑,或者接入第三方时间库传入格式串完成解析。
内容的提问来源于stack exchange,提问作者Serge Roussak
相关产品推荐
相关产品推荐

