windows 用 getlocaleinfoex(locale_name_user_default, locale_sshortdate) 获取短日期格式字符串,linux/macos 无等效 api,需通过 strftime("%x") 间接推断或 fallback 默认格式,qt 的 qlocale::dateformat 可跨平台封装此功能。

Windows 上用 GetLocaleInfoEx 获取短日期格式
Windows 提供了 GetLocaleInfoEx,能准确拿到当前系统设置的本地化短日期格式(比如 “yyyy/M/d” 或 “dd/MM/yyyy”)。它比旧版 GetLocaleInfo 更可靠,支持 UTF-16 且兼容现代区域设置。
- 必须传入
LOCALE_NAME_USER_DEFAULT(不是空字符串或LOCALE_USER_DEFAULT),否则可能回退到默认 locale 而非用户实际设置 - 查询时用
LOCALE_SSHORTDATE,返回的是以 null 结尾的宽字符字符串 - 返回缓冲区大小要至少为
LOCALE_NAME_MAX_LENGTH(通常 85),但实际格式字符串一般不超过 32 字符 - 如果函数返回 0,调用
GetLastError()查错误;常见原因是缓冲区太小或 locale 名无效
wchar_t shortDate[64] = {};
int len = GetLocaleInfoEx(LOCALE_NAME_USER_DEFAULT, LOCALE_SSHORTDATE, shortDate, _countof(shortDate));
if (len == 0) {
// 处理错误
}
// shortDate 现在是类似 L"yyyy/M/d" 的格式串
Linux/macOS 用 setlocale + strftime 模拟等效行为
POSIX 系统没有直接获取“短日期格式字符串”的 API,setlocale(LC_TIME, "") 只能影响 strftime 的输出行为,不暴露格式模板本身。所以得靠间接方式逼近:
- 先用
setlocale(LC_TIME, "")应用当前 locale - 构造一个固定日期(如 2023-04-05)调用
strftime,观察其输出形式(如 "04/05/23" vs "05.04.2023") - 无法还原出原始格式字符串(如 "%d.%m.%Y"),只能推断常见模式:年份位置、分隔符、是否带世纪等
- 注意
LC_TIME和LC_ALL可能不一致,优先用LC_TIME
setlocale(LC_TIME, "");
char buf[64];
struct tm t = {0};
t.tm_year = 123; // 2023
t.tm_mon = 3; // April
t.tm_mday = 5;
strftime(buf, sizeof(buf), "%x", &t); // 依赖 locale,输出如 "04/05/23"
跨平台封装时别硬编码格式,也别信任 %x 的可逆性
很多项目试图用 strftime("%x") 输出再反推格式,这不可靠:
%x输出是纯字符串,不含占位符信息(比如德语 locale 输出 "05.04.2023",你无法确定它是 "%d.%m.%Y" 还是 "%d.%m.%y")不同 libc 实现对同一 locale 的
%x解释可能略有差异(glibc vs musl vs Apple libc)
Android 操作系统的介绍 中文WORD版下载本文档主要讲述的是Android 操作系统的介绍;Android是基于Linux内核的操作系统,是Google公司在2007年11月5日公布的手机操作系统,早期由Google开发,后由开放手持设备联盟(Open Handset Alliance)开发。它采用了软件堆层(software stack,又名以软件叠层)的架构,主要分为三部分。底层Linux内核只提供基本功能;其他的应用软件则由各公司自行开发,部分程序以Java编写。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
Windows 的
GetLocaleInfoEx返回的是格式模板(含 y/M/d 符号),而 POSIX 没有对应能力若需真正跨平台格式字符串,建议只在 Windows 上用
GetLocaleInfoEx,Linux/macOS 默认 fallback 到"%Y-%m-%d"或让用户配置不要用
std::locale+std::time_put替代——它不提供格式模板访问接口,仅用于格式化输出
Qt 用户直接用 QLocale::dateFormat
如果你已在用 Qt,QLocale 封装了平台差异:
-
QLocale().dateFormat(QLocale::ShortFormat)在 Windows/macOS/Linux 上都返回QDate::toString所用的实际格式字符串(如"M/d/yyyy") - 它内部在 Windows 调用
GetLocaleInfoEx,在 POSIX 下基于 locale 数据库做映射,比手写更稳 - 注意:必须用
QLocale()(默认构造),而非QLocale::system()——后者在某些 Qt 版本中可能忽略用户设置
#include <qlocale> QString fmt = QLocale().dateFormat(QLocale::ShortFormat); // e.g. "yyyy-MM-dd" </qlocale>
真正麻烦的地方不在获取,而在后续怎么用这个格式串:C++ 标准库不解析它,第三方日期库(如 date.h)也不接受这种字符串模板。多数时候你拿到它,只是为了显示给用户看,或者转成自己能处理的结构——这点容易被忽略。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










