我有一些代码使用Oracle函数add_months来将Date增加X个月数。

我现在需要在C/C++函数中重新实现相同的逻辑。由于某些原因,我不想/不需要深入研究,所以我不能简单地向oracle发出查询以获取新日期。

有谁知道一种简单可靠的方法将time的X月份加X个月?
下面显示了一些计算类型的示例。

30/01/2009 +1个月= 28/02/2009
2009年1月31日+ 1个月= 2009年2月28日
27/02/2009 + 1个月= 2009年3月27日
28/02/2009 + 1个月= 2009年3月31日
2009年1月31日+ 50个月= 2013年3月31日

最佳答案

方法 AddMonths_OracleStyle 可以满足您的需求。

也许您想将IsLeapYear和GetDaysInMonth替换为某些图书馆员方法。

#include <ctime>
#include <assert.h>

bool IsLeapYear(int year)
{
    if (year % 4 != 0) return false;
    if (year % 400 == 0) return true;
    if (year % 100 == 0) return false;
    return true;
}

int daysInMonths[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

int GetDaysInMonth(int year, int month)
{
    assert(month >= 0);
    assert(month < 12);

    int days = daysInMonths[month];

    if (month == 1 && IsLeapYear(year)) // February of a leap year
        days += 1;

    return days;
}

tm AddMonths_OracleStyle(const tm &d, int months)
{
    bool isLastDayInMonth = d.tm_mday == GetDaysInMonth(d.tm_year, d.tm_mon);

    int year = d.tm_year + months / 12;
    int month = d.tm_mon + months % 12;

    if (month > 11)
    {
        year += 1;
        month -= 12;
    }

    int day;

    if (isLastDayInMonth)
        day = GetDaysInMonth(year, month); // Last day of month maps to last day of result month
    else
        day = std::min(d.tm_mday, GetDaysInMonth(year, month));

    tm result = tm();

    result.tm_year = year;
    result.tm_mon = month;
    result.tm_mday = day;

    result.tm_hour = d.tm_hour;
    result.tm_min = d.tm_min;
    result.tm_sec = d.tm_sec;

    return result;
}

time_t AddMonths_OracleStyle(const time_t &date, int months)
{
    tm d = tm();

    localtime_s(&d, &date);

    tm result = AddMonths_OracleStyle(d, months);

    return mktime(&result);
}

关于c++ - 在C/C++中将1个月添加到time_t的简单方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/423961/

10-12 14:12