如何在c i+中给当前日期加上一定的天数

xzlaal3s  于 2023-01-04  发布在  其他
关注(0)|答案(2)|浏览(142)

我一直试图在当前日期上添加一定的天数(我试图添加30)。
假设今天的日期是2023年1月1日,在加上我想加的天数后,我会得到31/1/2023,主要问题是我想加的是2月是29天还是28天。
我得到了当前日期,无法添加我想要的天数,因为我不知道其他方法来获得当前日期,而格式不像这样“Sun Jan 01 16:29:19 2023”。
只是一个侧记,我看到人们添加x天到一个日期使用c,但那些问题有用户插入日期,他们想要的问题,我的问题是添加到当前日期。
有人能帮我吗?

tyg4sfes

tyg4sfes1#

标准的库时间函数已经知道闰年和一个月的天数等,所以使用这些日历"专业知识"是有意义的。
这是我在Algorithm to add or subtract days from a date?中的答案的"重复",但是稍微修改了一下,去掉了C++的细节(因此没有把它标记为重复)。

#include <time.h>

// Adjust date by a number of days +/-
void DatePlusDays( const struct tm* date, int days )
{
    const time_t ONE_DAY = 24 * 60 * 60 ;

    // Seconds since start of epoch
    time_t date_seconds = mktime( date ) + (days * ONE_DAY) ;

    // Update caller's date
    // Use localtime because mktime converts to UTC so may change date
    *date = *localtime( &date_seconds ) ;
}

关于:
"* 我看到有人使用c将x天添加到日期,但这些问题是用户将他们想要的日期插入到问题中,我的问题是将其添加到当前日期。*"
因此,您只需要提供 * 当前日期 * 作为输入即可,而不必将解决方案限制为如此不灵活。
"当前日期"的用法示例:

#include <stdio.h>
#include <time.h>

int main( void )
{
    struct tm today ;
    today = *localtime( time(NULL) ) ;

    // Date, plus 30 days
    DatePlusDays( &today, 30 ) ; 

    // Show time/date using default formatting
    printf( "%s\n", asctime( &today) ) ;
}

它也可以用来减去天数(传递负天数)。
当然,如果您确实希望将解决方案限制为当前日期:

#include <time.h>

// Adjust date by a number of days +/-
const struct tm* TodayPlusDays( int days )
{
    const time_t ONE_DAY = 24 * 60 * 60 ;

    // Seconds since start of epoch
    time_t date_seconds = time( NULL ) + (days * ONE_DAY) ;

    // Update caller's date
    // Use localtime because mktime converts to UTC so may change date
    return localtime( &date_seconds ) ;
}

示例用法:

#include <stdio.h>
#include <time.h>

int main( void )
{
    struct tm today = *TodayPlusDays( 30 ) ;

    // Show time/date using default formatting
    printf( "%s\n", asctime( &today) ) ;
}
slhcrj9b

slhcrj9b2#

假设你已经把日期解析成了日、月和年,我们可以用一个非常简单的算法来“增加天数”,甚至可以减去天数(或者加上负天数)。
下面没有使用任何标准库来管理日期和时间。没有反对这些解决方案或标准库。但我想提出一个简单的便携式方式与公历,也考虑闰年。
首先是一个指示日期的结构体:

struct Date
{
    int day;
    int month;
    int year;
};

那我们就需要一个闰年的小帮手了。

bool isLeapYear(int year)
{
    // leap years happen on 4 year boundaries unless year is divisible by 100 and not 400
    // 2000 was a leap year, but 2100 is not
    if (year % 400 == 0) return true;
    if (year % 100 == 0) return false;
    return (year % 4 == 0);
}

使用此数据结构的Date和闰年检测函数,我们可以构建一个非常简单的解决方案。基本算法是“一次一天”递增给定日期,直到达到增加的天数。每次我们递增day成员超过一个月的天数时,它将重置为1,并递增month成员。类似地,我们处理下一年的增量。然后也调整闰年。

// adds "numberOfDays" to the date object pointed to by "d"
void AddDays(Date* d, int numberOfDays)
{
    static const int daysInMonths[]     = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    static const int daysInMonthsLeap[] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

    const int* monthTable = isLeapYear(d->year) ? daysInMonthsLeap : daysInMonths;

    // handle the case where we are adding a positive number of days to "d"
    while (numberOfDays > 0)
    {
        d->day++;
        if (d->day > monthTable[d->month])
        {
            d->month++;
            if (d->month > 12)
            {
                d->month = 1;
                d->year++;
                monthTable = isLeapYear(d->year) ? daysInMonthsLeap : daysInMonths;
            }
            d->day = 1;
        }
        numberOfDays--;
    }

    // handle the case where we are adding a negative number of days to "d". 
    while (numberOfDays < 0)
    {
        d->day--;
        if (d->day <= 0)
        {
            d->month--;
            if (d->month <= 0)
            {
                d->year--;
                d->month = 12;
                monthTable = isLeapYear(d->year) ? daysInMonthsLeap : daysInMonths;
            }
            d->day = monthTable[d->month];
        }
        numberOfDays++;
    }
}

上述方法不是最有效的--特别是当您要在给定的Date对象上添加数百万天时,但是对于处理少量天、周甚至少于几千年的时间调整,你可能会做得更糟。一个优化构建中的快速基准测试表明,对于在今天的基础上增加500万天,上面的工作速度相当快。It“我们的日期是到16000年或更晚。
在上面的循环中也有很多优化的机会。

相关问题