Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 转换后的年份值错误_C++_Winapi_Boost_Uwp - Fatal编程技术网

C++ 转换后的年份值错误

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

我正在将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 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下的逻辑是什么?你需要把这个分享给其他人。