转换后的年值错误

时间:2019-01-14 05:09:24

标签: c++ winapi boost uwp

我正在将格式为yy/mm/dd的日期转换为dd.mm.yyyy。但是它返回错误的年份值。

例如:30/12/31预期为 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)));
}

1 个答案:

答案 0 :(得分:1)

我想这遵循的逻辑与其他语言类似-解析将返回从今天开始的100范围内的年份。因此,如果您解析15/01/01,您将获得1/1/2015,但是当您解析30/01/01,您将获得1930/01/01。

但是,您所知道的是,年份的最后两位数字将匹配,因此您可以手动确定世纪。用伪代码

fixed_year = 2000 + year % 100;

在您的情况下,我使用的是21世纪(2000年),我将解析后的第二年除以100。因此,这样做的目的是切断世纪,并用21世纪代替它。