Неверное значение года после конвертации - PullRequest
0 голосов
/ 14 января 2019

Я конвертирую дату в формате 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 голосов
/ 14 января 2019

Я предполагаю, что следующая логика похожа на другие языки - синтаксический анализ вернет год, который соответствует диапазону 100 с сегодняшнего дня. Следовательно, если вы выполните синтаксический анализ 15.01.01, вы получите 01.01.2015, но при разборе 30.01.01 вы получите 1930.01.01.

Однако вы знаете, что последние две цифры года будут совпадать, так что вы можете просто исправить столетие вручную. В псевдокоде

fixed_year = 2000 + year % 100;

В вашем случае я использую 21-й век (2000) и добавляю остаток от деления на 100 от года, который я получил после разбора после. Так что это значит, что оно отрезает столетие и заменяет его 21-м столетием.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...