C++ 转换后的年份值错误
我正在将yy/mm/dd格式的日期转换为dd.mm.yyyy。但它返回了错误的年份值 例如:31年12月30日预计为2030年12月31日。但它正在返回1930年12月31日 我搞不懂为什么把1930年改为2030年C++ 转换后的年份值错误,c++,winapi,boost,uwp,C++,Winapi,Boost,Uwp,我正在将yy/mm/dd格式的日期转换为dd.mm.yyyy。但它返回了错误的年份值 例如:31年12月30日预计为2030年12月31日。但它正在返回1930年12月31日 我搞不懂为什么把1930年改为2030年 /// <summary>Gets a formatted date(gregorian date) as string from a date string with format - yy/mm/dd. </summary> /// <param
/// <summary>Gets a formatted date(gregorian date) as string from a date string with format - yy/mm/dd. </summary>
/// <param name="date">The date in format yy/mm/dd.</param>
/// <returns>The gregorian date in the format dd.mm.yyyy.</returns>
std::wstring GetFormattedDateString(const std::wstring& date)
{
if (date.empty())
return {};
LCID lcid = LocaleNameToLCID(L"en-us", LOCALE_ALLOW_NEUTRAL_NAMES); //parse language tag to get locale ID
DATE dt;
VarDateFromStr(date.c_str(), lcid, 2, &dt);
//get system time struct
SYSTEMTIME st;
::VariantTimeToSystemTime(dt, &st);
return GetDateFromTm(gregorian::to_tm(gregorian::date(st.wYear, st.wMonth, st.wDay)));
}
我猜下面的逻辑与其他语言类似——解析将返回从今天起100%范围内的年份。因此,如果您解析15/01/01,您将得到1/1/2015,但当您解析30/01/01时,您将得到1930/01/01 但是,您知道的是,年份的最后两位数字将匹配,因此您可以手动修复世纪。伪码
fixed_year = 2000 + year % 100;
在你的例子中,我使用的是21世纪2000,我将解析后得到的年份除以100的余数相加。因此,它切断了21世纪,取而代之的是21世纪。对于99/12/31的预期是什么?应该是31.12.2099您的预期与您调用的函数的设计行为之间存在差异。你的期望似乎不匹配,前进的方向是将你的期望与你所使用的功能相一致。如果函数不能满足您的要求,您可能需要编写自己的函数。在Windows语言环境设置中,输入两位数年份时会有一个名为的字段,将其解释为默认值为1930到2029之间的年份,因此30年将变为1930年,而不是2030年,@sohel14_cse_ju关键逻辑与您使用的GetDateFromTm方法有关,该方法不是来自官方图书馆。那么GetDateFromTm下的逻辑是什么?你需要把这个分享给其他人。