获得保证具有完整(4 位)年份数字的 LOCALE_SSHORTDATE 的正确方法是什么?

What is the correct way to get a LOCALE_SSHORTDATE that is guaranteed to have a full (4-digit) year number?

我想创建一个显示日期和时间的日期时间选择器控件,作为 DTS_SHORTDATECENTURYFORMATDTS_TIMEFORMAT 样式的组合。由于日期时间选择器中没有内置这种样式,因此我必须自己使用 GetLocaleInfoEx().

我注意到默认情况下,GetLocaleInfoEx(LOCALE_SSHORTDATE) 似乎是 return 一个四位数的年份,这正是我想要的。这个可靠吗?它没有在任何地方记录,只是 LOCALE_SSHORTDATE 可以有多个字符串。如果我必须枚举可能的字符串,我怎么知道哪一个是我想要的?我是否只查找第一个包含 yyyy 的字符串?这对我来说听起来不可靠,至少不可靠...

谢谢。

不,您不能依赖 LOCALE_SSHORTDATE 有四位数的年份,因为用户可以通过区域控制面板进行配置,并且可以使用两位数年份的选项。

如果您想强制使用四位数年份(并覆盖用户的偏好),您也可以只提供自己的短日期字符串。或者,您可以扫描用户的字符串并将 "yy" 更改为 "yyyy".

您还可以将 GetDateFormatGetTimeFormatLOCALE_SSHORTDATE 等结合使用

wchar_t buf[100];

SYSTEMTIME st;
GetSystemTime(&st);
GetDateFormat(0, DATE_LONGDATE, &st, 0, buf, 100);
GetDateFormat(0, DATE_SHORTDATE, &st, 0, buf, 100);
GetTimeFormat(0, 0, &st, 0, buf, 100);
GetTimeFormat(0, TIME_NOSECONDS, &st, 0, buf, 100);

那么也许你就不用担心格式化是如何完成的了。即使对于长日期格式,年份有时也会设置为 yy。例如在 ControlPanel->Region->Format: switch to French language, 它允许不同于美国英语的选项。