如何实现在日期字符串上加天数?

frankspy 2008-11-23 11:05:02
比如我有一个日期字符串"20081030", 加5天后,得到"20081104"? 或者加30天... 请问是否可以用time.h里的函数实现?怎么实现?
...全文
537 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
就呆在云上 2008-11-23
  • 打赏
  • 举报
回复
给一个可以用的哈哈
不过加天数的函数要自己实现啦:
#include <stdio.h> 
#include <string.h>
#include <stdlib.h>
void adddays(int &year,int &month, int &day, int num){//num是添加的天数
}
int main()
{
char str[] = "20081030";
int year, month, day;
sscanf(str, "%4d%2d%3d", &year, &month, &day);
int days;
scanf("%d", &days);
adddays(year, month, day, days);
sprintf(str, "%4d%2d%2d", year, month, day);
puts(str);
return 1;
}
toadzw 2008-11-23
  • 打赏
  • 举报
回复
你可以先将日期转换成秒数,然后在微秒数上直接加上5天,再由秒转换成日期就可以了;time.h中都有这些函数;
toadzw 2008-11-23
  • 打赏
  • 举报
回复
你可以先将日期转换成秒数,然后在微秒数上直接加上5天,再由秒转换成日期就可以了;time.h中都有这些函数;
toadzw 2008-11-23
  • 打赏
  • 举报
回复
你可以先将日期转换成秒数,然后在微秒数上直接加上5天,再由秒转换成日期就可以了;time.h中都有这些函数;
bfhtian 2008-11-23
  • 打赏
  • 举报
回复
up ls
帅得不敢出门 2008-11-23
  • 打赏
  • 举报
回复

#include <iostream.h>

long CalcDays(long date,int offset)
{
int DayInMonth[12]={31,0,31,30,31,30,31,31,30,31,30,31};

int temp;

int year=date/10000;
int month=date/100-year*100;
int day=date%100;

while(offset>=DayInMonth[(month-1)%12])
{
if (++month>12)
{
month=1;
year++;
if(year%400==0||(year%4==0&&year%100!=0))
DayInMonth[1]=29;
else
DayInMonth[1]=28;
}
offset-=DayInMonth[(month-1)%12];
}
temp=day;
day=(day+offset-1)%DayInMonth[(month-1)%12]+1;
month+=(temp+offset-1)/DayInMonth[(month-1)%12];
year+=(month-1)/12;
month=(month-1)%12+1;
return (long)year*10000+month*100+day;
}
void main()
{
cout<<CalcDays(20031231,30)<<endl;
}
帅得不敢出门 2008-11-23
  • 打赏
  • 举报
回复
网上有相关的例子

#include <iostream.h>
#include <conio.h>

class date
{
private:
int year, month, day;
public:
date(int y = 2003, int m = 12, int d =30) //构造函数
{
year = y;
month = m;
day = d;
}
set_date(); //设置日期
add_day(int, int, int, int); //加天
int IsLeapYear(int y); //判断闰年
int get_year(){return year;} //返回年
int get_month(){return month;} //返回月
int get_day(){return day;} //返回日
print_date(int i)
{
cout<<" "<<i<<" "<<day<<"/"<<month<<"/"<<year;
if(IsLeapYear(year))
cout<<" (闰年)"<<endl;
else
cout<<" (不是闰年)"<<endl;
}
~date(); //析构函数
};

date::set_date() //设置日期
{
int y, m, d;
cout<<"请输入要年:"<<endl;
cin>>y;
cout<<"请输入要月:"<<endl;
cin>>m;
cout<<"请输入要日:"<<endl;
cin>>d;
year = y;
month = m;
day = d;
}

date::add_day(int num, int y, int m, int d) //加天
{
int month_day[]={29,31,28,31,30,31,30,31,31,30,31,30,31};
int addday, total, i;
year=y;
if(IsLeapYear(year))
total = 366;
else
total = 365;
cout<<"请输入要加的天数: \n";
cin>>addday;
while(addday>=total) //加年
{
year++;
addday-=total;
if(IsLeapYear(year))
total = 366;
else
total = 365;
}

if(IsLeapYear(year)&&(m==2))
i = 0;
else
i = m;
while(addday>=month_day[i]) //加月
{
month++;
if(month>12)
{
year++;
month=1;
}
addday-=month_day[i];
if(IsLeapYear(year)&&(m==2))
i = 0;
else
i = m;
}
d+=addday;
while(d>=month_day[i]) //加天
{
d-=month_day[i];
month++;
if(month>12)
{
year++;
month=1;
}
if(IsLeapYear(year)&&(m==2))
i = 0;
else
i = m;
}
day=d;

}

int date::IsLeapYear(int y) //判断闰年
{
if(((y%4==0)&&(y%100!=0))||(y%400==0))
return 1;
else
return 0;
}

date::~date() //析构函数
{
//
}

int main(int argc, char* argv[])
{
date *date1;
date1 = new date[5];
int num=0, y, m, d;
if(!date1)
{
cout<<"allocation failure!"<<endl;
exit(0);
}
for(int i=0; i<5; i++)
date1[i].print_date(i);

cout<<"请输入要修改的日期编号:"<<endl;
cin>>num;
if((num>=0)&&(num<=4))
{
date1[num].set_date();
for(int i = 0; i<5; i++)
date1[i].print_date(i);
}
else
cout<<"没有该编号"<<endl;

cout<<"请输入年份判断是否是闰年"<<endl;
cin>>y;
date test(y);
if(test.IsLeapYear(y))
cout<<"是闰年"<<endl;
else
cout<<"不是闰年"<<endl;
cout<<"请输入要加天数的日期编号:"<<endl;
cin>>num;
y = date1[num].get_year();
m = date1[num].get_month();
d = date1[num].get_day();
date1[num].add_day(num, y, m, d);
cout<<"加天后的日期为: ";
date1[num].print_date(num);

cout<<"=====================\n按任意键结束程序"<<endl;
getch();
delete []date1;
return 0;
}

wind1373290 2008-11-23
  • 打赏
  • 举报
回复
先将字符串分解(比如20081030 分解成2008 10 30分别用三个变量存储)
先判断年份是不是润年,在看下是几月份,最后就可以确定日期了,
日期的确定看看是否会超出日期的最大值,此外12月份要稍稍注意
代码不会很难啊 楼主加油噢
frankspy 2008-11-23
  • 打赏
  • 举报
回复
应该怎样实现?谢谢了!
帅得不敢出门 2008-11-23
  • 打赏
  • 举报
回复
这个要自己判断 是日期加1还是日期清为1月份加1
nullah 2008-11-23
  • 打赏
  • 举报
回复
MARK
winingsky 2008-11-23
  • 打赏
  • 举报
回复
不知道怎么用time.h的函数实现,只知道最原始的方法。就象4楼说的那样!
bbb332 2008-11-23
  • 打赏
  • 举报
回复
帮顶!!!!!
chen_de_sheng 2008-11-23
  • 打赏
  • 举报
回复
关于time.h的使用可以参考一下
http://blog.sina.com.cn/s/blog_494020500100atuf.html
chen_de_sheng 2008-11-23
  • 打赏
  • 举报
回复
#include<time.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//如果计算中不涉及北京时间1970年1月1日早上8点以前的时间的话,是可以实现的
char *tm2str(tm* pTm)
{
int year = pTm->tm_year + 1900;
int mon = pTm->tm_mon + 1;
int day = pTm->tm_mday;

char *ret = (char*)malloc(10);
memset(ret, 0, 10);
sprintf(ret, "%d", year);
ret[4] = mon / 10 + '0';
ret[5] = mon % 10 + '0';
ret[6] = day / 10 + '0';
ret[7] = day % 10 + '0';
return ret;
}
tm *str2tm(char date[])
{
int year, mon, day;
sscanf(date, "%4d%2d%2d", &year, &mon, &day);

tm *pDate = (tm*)malloc(sizeof(tm));
memset(pDate, 0, sizeof(tm));
pDate->tm_year = year - 1900;//年份从1900开始
pDate->tm_mon = mon - 1;//月份从0开始
pDate->tm_mday = day;
return pDate;
}
char *addDays(char date[], int days)
{

time_t time = mktime(str2tm(date));

time += days * 24 * 3600;//增加秒数

tm * res = localtime(&time);

return tm2str(res);
}
void main()
{
printf("%s\n", addDays("20081030", 5));//20081030 + 5 = 20081104
}
内容概要:本文系统研究了开关频率大于谐振频率(fs>fr)工况下,移相混合控制LLC谐振变换器在低压增益区域的工作特性,深入分析其在变频与移相结合控制模式下的调制机理、工作模态划分及损耗分布规律。通过Simulink平台构建高保真仿真模型,对变换器在不同负载和输入条件下的电压增益、转换效率、关键器件电压电流应力等性能指标进行了全面仿真验证,重点探讨了其在低增益区间的软开关实现能力与效率优化潜力,旨在提升LLC变换器在宽范围输入输出应用中的动态响应与能源转换效率。; 适合人群:从事电力电子变换器设计、高频电源开发及相关领域的高校研究生、科研院所研究人员及企业研发工程师,要求具备扎实的电路理论基础、电力电子技术知识以及一定的Simulink仿真能力。; 使用场景及目标:①深入理解LLC谐振变换器在fs>fr条件下采用移相混合控制的内在工作机理与模态转换过程;②掌握利用Simulink搭建复杂谐振变换器精确仿真模型的方法与技巧;③分析并优化低压增益区的增益特性与损耗构成,为设计高效率、高功率密度的软开关电源提供理论依据和数据支持; 阅读建议:建议读者结合文中所述仿真模型,亲自复现仿真过程,重点观察不同控制参数(如移相比、开关频率)对电压增益曲线和关键波形的影响,并对比传统变频控制策略,深入探究混合控制在拓宽调压范围、提升轻载效率方面的优势,从而深化对现代高效谐振电源设计的理解。
内容概要:本文提出了一种基于粒子群优化算法(PSO)的配电网光伏储能双层优化配置模型,以IEEE33节点系统为标准算例,实现光伏发电单元与储能系统的协同选址与定容优化。该模型采用双层架构设计,上层以投资成本、运行经济性及网络损耗最小为目标优化设备配置方案,下层通过潮流计算评估系统在不同负荷场景下的运行性能,综合考虑电压稳定性、供电可靠性及可再生能源消纳能力,最终通过Matlab编程实现完整求解流程,为高渗透率分布式电源接入背景下的配电网规划提供了有效的技术支撑。; 适合人群:具备电力系统分析基础和Matlab编程能力的研究生、高校科研人员及从事新能源并网、智能配电网规划与优化的工程技术人员。; 使用场景及目标:①研究含高比例光伏接入的配电网规划与运行协同优化问题;②掌握双层优化建模方法与粒子群算法在复杂电力系统问题中的应用技巧;③为实际工程中分布式光伏与储能系统的科学选址与容量配置提供理论依据与仿真验证平台。; 阅读建议:建议读者结合Matlab代码深入理解双层迭代求解机制,重点关注算法收敛性分析、参数敏感性测试,并可通过更换初始种群、调整权重因子或引入其他标准测试系统(如IEEE69节点)进行对比实验,进一步验证所提模型的普适性与鲁棒性。
内容概要:本文围绕双机并联虚拟同步发电机(VSG)在微电网中的功率分配、黑启动、虚拟阻抗与预同步控制展开,基于Simulink平台构建了完整的微电网系统仿真模型。重点研究了VSG在双机并联运行下的有功/无功功率均分控制策略,通过引入虚拟阻抗技术有效解决了因线路阻感比差异导致的功率分配不均问题。同时,设计了微电网黑启动流程与并网预同步控制模块,实现了待并网系统与主网在电压幅值、频率和相位上的精确同步,显著降低了并网冲击电流。系统整合了VSG控制、下垂控制、虚拟阻抗、锁相环(PLL)及预同步逻辑等关键环节,全面验证了多VSG协同运行的稳定性、自主恢复能力与并网可靠性。; 适合人群:具备电力系统、电力电子及自动控制等相关专业知识,从事微电网、分布式发电、VSG控制与并网技术研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①深入理解双机并联VSG系统中功率分配不均的机理及虚拟阻抗的补偿作用;②掌握微电网黑启动全过程及预同步控制的关键技术要点;③学习并实践基于Simulink的微电网多层次、多目标控制策略的建模与仿真方法;④为相关科研课题、毕业设计或实际工程项目提供可复现、可拓展的技术方案与仿真参考。; 阅读建议:建议结合提供的Simulink模型文件进行同步学习,重点关注VSG控制参数整定、虚拟阻抗设计原则、预同步切换逻辑等核心模块的实现细节,并可通过改变负载投切、线路参数或初始频率偏差等条件进行多工况仿真测试,以深入探究系统的动态响应特性与鲁棒性。

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧