【发布时间】:2020-03-04 01:47:06
【问题描述】:
我有这个代码:
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
【问题讨论】:
-
你想要的结果是什么?至于您在使用 boost 时遇到的错误:编译器抱怨缩小转换。这是由于使用了大括号初始化。将年/月/日值显式转换为适当的类型,或使用带括号的直接初始化 (
dStart( datStart.GetYear(), ... );)。 -
恐怕我对boost不是很熟悉。更重要的问题仍然是:在任何给定时间点增加 1 年时,您期望的结果是什么?实现是(一旦该问题得到回答),很可能是微不足道的。而且你也不需要提升,使用 C++'std::chrono 库。
-
可以理解,但是对您来说一年是什么?总是 365 天吗?默认为 365 天,如果范围包括 2 月 29 日,则为 366 天? 365.25 天? 365.2425 天?还有什么?
-
查看我的comment here 关于 boost 库的信息。我很久以前就开始为约会做准备了。 @IInspectable 说 DATE 可怕是温和的。 :)
-
@lak:你不需要提升。 std::chrono 自 C++11 以来一直是 C++ 的一部分。使用 C++20,库终于完成了,添加了缺少的部分:日历、时区、解析和格式化。有问题的代码很简单:
auto const datStart{chrono::system_clock::now()}; auto const datEnd{datStart + years{1}};(在 C++20 中),或在 C++11 中... +24h * 365。
标签: c++ mfc coledatetime