#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 ) ;
}
#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) ) ;
}
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);
}
// 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++;
}
}
2条答案
按热度按时间tyg4sfes1#
标准的库时间函数已经知道闰年和一个月的天数等,所以使用这些日历"专业知识"是有意义的。
这是我在Algorithm to add or subtract days from a date?中的答案的"重复",但是稍微修改了一下,去掉了C++的细节(因此没有把它标记为重复)。
关于:
"* 我看到有人使用c将x天添加到日期,但这些问题是用户将他们想要的日期插入到问题中,我的问题是将其添加到当前日期。*"
因此,您只需要提供 * 当前日期 * 作为输入即可,而不必将解决方案限制为如此不灵活。
"当前日期"的用法示例:
它也可以用来减去天数(传递负天数)。
当然,如果您确实希望将解决方案限制为当前日期:
示例用法:
slhcrj9b2#
假设你已经把日期解析成了日、月和年,我们可以用一个非常简单的算法来“增加天数”,甚至可以减去天数(或者加上负天数)。
下面没有使用任何标准库来管理日期和时间。没有反对这些解决方案或标准库。但我想提出一个简单的便携式方式与公历,也考虑闰年。
首先是一个指示日期的结构体:
那我们就需要一个闰年的小帮手了。
使用此数据结构的Date和闰年检测函数,我们可以构建一个非常简单的解决方案。基本算法是“一次一天”递增给定日期,直到达到增加的天数。每次我们递增day成员超过一个月的天数时,它将重置为1,并递增month成员。类似地,我们处理下一年的增量。然后也调整闰年。
上述方法不是最有效的--特别是当您要在给定的Date对象上添加数百万天时,但是对于处理少量天、周甚至少于几千年的时间调整,你可能会做得更糟。一个优化构建中的快速基准测试表明,对于在今天的基础上增加500万天,上面的工作速度相当快。It“我们的日期是到16000年或更晚。
在上面的循环中也有很多优化的机会。