我正在将格式为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)));
}
答案 0 :(得分:1)
我想这遵循的逻辑与其他语言类似-解析将返回从今天开始的100范围内的年份。因此,如果您解析15/01/01,您将获得1/1/2015,但是当您解析30/01/01,您将获得1930/01/01。
但是,您所知道的是,年份的最后两位数字将匹配,因此您可以手动确定世纪。用伪代码
fixed_year = 2000 + year % 100;
在您的情况下,我使用的是21世纪(2000年),我将解析后的第二年除以100。因此,这样做的目的是切断世纪,并用21世纪代替它。