我有这个代码:
COleDateTime datStart = COleDateTime::GetCurrentTime(), datEnd;
// Update end date (one year later)
datEnd.SetDateTime(datStart.GetYear() + 1,
datStart.GetMonth(),
datStart.GetDay(),
datStart.GetHour(),
datStart.GetMinute(),
datStart.GetSecond());
上述代码昨天(2020 年 2 月 29 日)失败,因为datEnd
导致2021 年 2 月 29 日无效。
datStart
在考虑闰年的情况下安全地增加一年的正确方法是什么?
C# 有:
DateTime theDate = DateTime.Now;
DateTime yearInTheFuture = theDate.AddYears(1);
MFC/C++ 的等价物是什么?
一种可能性是:
COleDateTimeSpan spnYear;
spnYear.SetDateTimeSpan(365, 0, 0, 0);
datEnd = datStart + spnYear;
但由于闰年有 366 天,它仍然存在潜在缺陷。那么正确的方法是什么?
我看到这个类似的问题:
这意味着使用boost
. 尽管从未将其用于日期操作,但我的项目确实有所提升。想知道这是否可以与COleDateTime
对象一起使用?
使用boost
:
boost::gregorian::date dStart{ datStart.GetYear(), datStart.GetMonth(), datStart.GetDay() };
boost::gregorian::date dEnd = dStart + boost::gregorian::years(1);
datEnd.SetDateTime(
dEnd.year(),
dEnd.month(),
dEnd.day(),
datStart.GetMonth(),
datStart.GetMinute(),
datStart.GetSecond());
不编译。
4>D:\My Programs\2019\MeetSchedAssist\Meeting Schedule Assistant\PublishersDatabaseDlg.cpp(354,49): error C2398: Element '1': conversion from 'int' to 'boost::gregorian::date::year_type' requires a narrowing conversion
4>D:\My Programs\2019\MeetSchedAssist\Meeting Schedule Assistant\PublishersDatabaseDlg.cpp(354,70): error C2398: Element '2': conversion from 'int' to 'boost::gregorian::date::month_type' requires a narrowing conversion
4>D:\My Programs\2019\MeetSchedAssist\Meeting Schedule Assistant\PublishersDatabaseDlg.cpp(354,89): error C2398: Element '3': conversion from 'int' to 'boost::gregorian::date::day_type' requires a narrowing conversion