C 获得保证具有完整(4位)年份号的地区缩短日期的正确方法是什么?

C 获得保证具有完整(4位)年份号的地区缩短日期的正确方法是什么?,c,winapi,locale,C,Winapi,Locale,我想创建一个日期时间选择器控件,将日期和时间显示为DTS\u SHORTDATECENTURYFORMAT和DTS\u TIMEFORMAT样式的组合。由于日期时间选择器中没有内置这样的样式,因此我必须使用getLocaleInfo()自己完成 我注意到默认情况下,getLocaleInfo(LOCALE\u SSHORTDATE)似乎返回四位数的年份,这正是我想要的。这可靠吗?任何地方都没有文档记录,只是LOCALE\u SSHORTDATE可以有多个字符串。如果我必须列举可能的字符串,我怎么

我想创建一个日期时间选择器控件,将日期和时间显示为
DTS\u SHORTDATECENTURYFORMAT
DTS\u TIMEFORMAT
样式的组合。由于日期时间选择器中没有内置这样的样式,因此我必须使用
getLocaleInfo()
自己完成

我注意到默认情况下,
getLocaleInfo(LOCALE\u SSHORTDATE)
似乎返回四位数的年份,这正是我想要的。这可靠吗?任何地方都没有文档记录,只是
LOCALE\u SSHORTDATE
可以有多个字符串。如果我必须列举可能的字符串,我怎么知道哪一个是我想要的?我是否只查找包含
yyyy
的第一个字符串?这听起来不可靠,至少它本身不可靠


谢谢。

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


如果您想要强制执行四位数的年份(并覆盖用户的首选项),您也可以只提供自己的短日期字符串。或者,您可以扫描用户的字符串并将“yy”更改为“yyy”。

您还可以将
GetDateFormat
GetTimeFormat
LOCALE\u 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
。例如,在控制面板->区域->格式:切换到法语,它允许不同于美国英语的选项。

在这种情况下,我想知道为什么会出现
DTS\u SHORTDATECENTURYFORMAT
。。。如果这是这里提供的最佳选项,我可能会保留当前拥有的内容(以
GetLocaleInfoEx()
返回的默认短日期字符串为准)。同时谢谢。我想我将把
yy
改为
yyy
选项,因为这似乎是标准控件对
DTS\u SHORTDATECENTURYFORMAT
所做的。:/。谢谢