我有一些代码,使用Oracle函数add_months将Date增加X个月。
我现在需要在C / C++函数中重新实现相同的逻辑。由于我不想/不需要进入的原因,我不能简单地向Oracle发出查询来获得新的日期。
有没有人知道一个简单可靠的方法来将X个月数添加到time_t?计算类型的一些示例如下所示。
30/01/2009 + 1个月= 28/02/2009
31/01/2009 + 1个月= 28/02/2009
2009年2月27日+ 1个月= 2009年3月27日
2009年2月28日+ 1个月= 2009年3月31日
31/01/2009 + 50个月= 31/03/2013
4条答案
按热度按时间rpppsulh1#
你可以使用Boost.GregorianDate来实现。
更具体地说,通过添加正确的
date_duration
来确定月份,然后从日期算法中使用end_of_month_day()
kiz8lqtg2#
使用this free and open source library和C++14编译器(如clang),我现在可以这样写:
它编译。
注意实际代码和OP的伪代码之间的显著相似性:
30/01/2009 + 1个月= 28/02/2009
31/01/2009 + 1个月= 28/02/2009
2009年2月27日+ 1个月= 2009年3月27日
2009年2月28日+ 1个月= 2009年3月31日
31/01/2009 + 50个月= 31/03/2013
还要注意,编译时信息 in 会导致编译时信息 out。
C++20
<chrono>
更新:你的C供应商开始发布C20
<chrono>
,它可以在没有第三方库的情况下使用几乎相同的语法做到这一点。还要注意OP添加月份所需的一些不寻常的规则,这在
<chrono>
中很容易实现:如果结果月份溢出日期字段或(如果输入月份是该月的最后一天),则将结果捕捉到该月的末尾。
Demo.
dsekswqp3#
将
time_t
转换为struct tm
,将X添加到月份,将月份> 12添加到年份,然后转换回来。tm.tm_mon是一个int,添加32000+个月应该没有问题。[编辑]你可能会发现匹配Oracle是棘手的,一旦你到了更难的情况下,如添加12个月到29/02/2008。01/03/2009和28/02/2008均合理。
clj7thdc4#
方法AddMonths_OracleStyle可以满足您的需要。
也许你会想用IsLeapYear和GetDaysInMonth替换一些库管理器方法。