求救:一个计算时间的问题。

phenixzh 2002-05-18 10:00:58
给定一个时间 如:2002年5月17日3时40分10秒
给定一个时间间隔 如:2年3个月4天5个小时50分钟40秒 。
求给定时间加上 给定的时间间隔后的时间 。
...全文
142 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
phenixzh 2002-05-20
  • 打赏
  • 举报
回复
我的程序 : 先吧前一个转换为long型 加上间隔中的的天数 再将lang型转换成yyyymmdd型 然后,再加上间隔中的月,年。 大致如下:int
dtaddinv( char *from, char *inv, char *to )
{
char fdate[9];
char ftime[7];
char invdate[9];
char invtime[7];
long ret;
long fdatelong;
long tdatelong;
int sec, min, hour;
int day, month, year;
int add;
char buf_1[5];
char buf_2[5];

memcpy( fdate, from, 8 );
fdate[8]='\0';
memcpy( invdate, inv, 8 );
invdate[8]='\0';

memset( ftime, 0, sizeof(ftime) );
if( strlen( from ) > 8 ){ memcpy( ftime, from + 8, 6 );
ftime[6] = '\0';
}

memset( invtime, 0, sizeof(invtime));
if( strlen( invtime) > 8 ){
memcpy( invtime, inv + 8, 6 );
invtime[6] = '\0';
}

ret = dstol( fdate, fdatelong );
if( ret != 0 )
return( -1 );


/* 秒相加 */
memcpy( buf_1, ftime + 4, 2);
buf_1[2] = '\0';
memcpy( buf_2, invtime + 4, 2);
buf_2[2] = '\0';
sec = (atoi(buf_1) + atoi(buf_2)) % 60;
add = (atoi(buf_1) + atoi(buf_2)) / 60;
/* 分相加 */
memcpy( buf_1, ftime + 2, 2);
buf_1[2] = '\0';
memcpy( buf_2, invtime + 2, 2);
buf_2[2] = '\0';
min = (atoi(buf_1) + atoi(buf_2) + add ) % 60;
add = (atoi(buf_1) + atoi(buf_2) + add ) / 60;

/* 小时相加 */
memcpy( buf_1, ftime, 2);
buf_1[2] = '\0';
memcpy( buf_2, invtime, 2);
buf_2[2] = '\0';
hour = (atoi(buf_1) + atoi(buf_2) + add ) % 24;
add = (atoi(buf_1) + atoi(buf_2) + add ) / 24;

/* 天相加 */
tdatelong = fdatelong + add + atol( invdate[6] );
ret = rfmtlong( tdatelong, "YYYYMMDD", to );
if( ret != 0 )
return( -1 );

/* 月相加 */
memcpy( buf_1, to + 2, 2);
buf_1[2] = 0;
memcpy( buf_2, invdate + 2, 2);
buf_2[2] = 0;

month = (atoi( buf_1 ) + atoi( buf_2 )) % 12;
add = (atoi( buf_1 ) + atoi( buf_2 )) / 12;

/* 年相加 */
memcpy( buf_1, to, 4);
buf_1[4] = 0;
memcpy( buf_2, invdate, 4);
buf_2[4] = 0;
year = atoi(buf_1)+ atoi(buf_2) + add;

/* 最终结果 */
if( month < 10 )
sprintf( to, "%d0%d", year, month);
else
sprintf( to, "%d%d", year, month);
return 0;
}




phenixzh 2002-05-18
  • 打赏
  • 举报
回复
那意味着什么呢? 请高人指点迷津
johnsonrao 2002-05-18
  • 打赏
  • 举报
回复
各位不会不知道时间就是浮点数吧?
phenixzh 2002-05-18
  • 打赏
  • 举报
回复
我正在苦思冥想如何来算呢?
phenixzh 2002-05-18
  • 打赏
  • 举报
回复
那其中的润年 和 某个月有31天 某个月有30天 时间间隔就不能这样来算了吧!
microblue 2002-05-18
  • 打赏
  • 举报
回复
应该是 tp->tm_year + 1900 表示年份。
microblue 2002-05-18
  • 打赏
  • 举报
回复
给定一个时间 如:2002年5月17日3时40分10秒
给定一个时间间隔 如:2年3个月4天5个小时50分钟40秒 。
在C语言中:
第一步,先将时间间隔转化为秒数:
time_t n1 = 2年3个月4天5个小时50分钟40秒 = ((((2*12+3)*30+4)*24+5)*60+50)*60+40秒;
第二步:
struct tm t0;
t0.tm_year = 102;
t0.tm_mon = 4; // May = 4
t0.tm_mday = 17;
t0.tm_hour = 5;
t0.tm_min = 40;
t0.tm_sec = 10;
time_t n0 = mktime(&t0);
第三步:
n0 += n1;
第四步:
struct tm * tp = localtime(&n0);
tp 即为所求。
如 tp->tm_year 表示年份,tp->tm_mon + 1 表示月份,...
phenixzh 2002-05-18
  • 打赏
  • 举报
回复
谢谢!非常感谢 如果只有C呢 我要在SCO UNIX 上来实现这个东东。
microblue 2002-05-18
  • 打赏
  • 举报
回复
C#:用 DateTime 类和 DateTimeSpan 类可以很轻松搞定。
Visusl C++: 用 OleDateTime 和 OleDateTimeSpan 类可以很轻松搞定。
microblue 2002-05-18
  • 打赏
  • 举报
回复
实际上时间间隔的最大单位只能是“天”,如要用“月”和“年”,就按一个月等于三十天,一年等于十二个月折算为天。
不然,就会出现:
2002年01月28日 + 1个月 = 2002年02月28日 (1个月 = 31天)
2002年01月29日 + 1个月 = 2002年02月28日 (1个月 = 30天)
2002年01月30日 + 1个月 = 2002年02月28日 (1个月 = 29天)
2002年01月31日 + 1个月 = 2002年02月28日 (1个月 = 28天)
这样变成同一个时间时隔代表的大小不一样了。
phenixzh 2002-05-18
  • 打赏
  • 举报
回复
谢谢,那如果天数相加大于两个月怎么办?而且如果吧天数相加放在最后作也会有隐患 就是如果天数相加后大于一个月那么 月要进位 此时如果导致年进位那么 程序中关于润年的判断就会有问题。
在想想 我也还没想出办法来。
hslinux 2002-05-18
  • 打赏
  • 举报
回复
/*先加秒,分,小时;再加月,然后加年,判断是否是闰年,以确定2月的天数*/

#define year 0
#define month 1
#define day 2
#define hour 3
#define minute 4
#define second 5

void main()
{
int time1[6],time2[6],time3[6];
int i,leap_year;

/*输入time1*/
for (i=0;i<6;i++)
scanf("%d",&time1[i]);

/*输入time2*/
for (i=0;i<6;i++)
scanf("%d",&time2[i]);

/*秒相加*/
if ((time1[second]+time2[second])>=60)
{
time3[second]=time1[second]+time2[second]-60;
if (time3[second]==0) time3[second]=1;
time3[minute]=1;/*分+1*/
}
else {
time3[second]=time1[second]+time2[second];
time3[minute]=0;
}

/*分相加*/
if ((time1[minute]+time2[minute]+time3[minute])>=60)
{
time3[minute]=time1[minute]+time2[minute]-60;
if (time3[minute]==0) time3[minute]=1;
time3[hour]=1;/*小时+1*/
}
else {
time3[minute]=time1[minute]+time2[minute]+time3[minute];
time3[hour]=0;
}

/*小时相加*/
if ((time1[hour]+time2[hour]+time3[hour])>=24)
{
time3[hour]=time1[hour]+time2[hour]-24;
time3[day]=1;/*天+1*/
}
else {
time3[hour]=time1[hour]+time2[hour]+time3[hour];
time3[day]=0;
}

/*月相加*/
if ((time1[month]+time2[month])>12)
{
time3[month]=time1[month]+time2[month]-12;
time3[year]=1;/*年+1*/
}
else {
time3[month]=time1[month]+time2[month]+time3[month];
}

/*年相加*/
time3[year]=time1[year]+time2[year]+time3[year];

/*天相加*/
leap_year=((time3[year]%4==0&&time3[year]%100!=0)||(time3[year]%400==0));
/*上句判断相加后那年是否是闰年*/
switch(time3[month])
{
case 2: if (leap_year)
if ((time1[day]+time2[day]+time3[day])>=29)
{
time3[day]=time1[day]+time2[day]-29;
if (time3[day]==0) time3[day]=1;
time3[month]=time3[month]+1;/*月+1*/
}
else {
time3[hour]=time1[hour]+time2[hour]+time3[hour];
}
else if ((time1[day]+time2[day]+time3[day])>=28)
{
time3[day]=time1[day]+time2[day]-28;
if (time3[day]==0) time3[day]=1;
time3[month]=time3[month]+1;/*月+1*/
}
else {
time3[hour]=time1[hour]+time2[hour]+time3[hour];
}
break;

case 4:
case 6:
case 9:
case 11: if ((time1[day]+time2[day]+time3[day])>=30)
{
time3[day]=time1[day]+time2[day]-30;
if (time3[day]==0) time3[day]=1;
time3[month]=time3[month]+1;/*月+1*/
}
else {
time3[hour]=time1[hour]+time2[hour]+time3[hour];
}
break;
default: if ((time1[day]+time2[day]+time3[day])>=31)
{
time3[day]=time1[day]+time2[day]-31;
if (time3[day]==0) time3[day]=1;
time3[month]=time3[month]+1;/*月+1*/
}
else {
time3[hour]=time1[hour]+time2[hour]+time3[hour];
}
}
if (time3[month]>12) {time3[month]=1;time3[year]++;}

printf("\nInput time1 is:");
for (i=0;i<3;i++)
printf("%d//",time1[i]);
for (;i<6;i++)
printf("%d:",time1[i]);

printf("\nInput time2 is:");
for (i=0;i<3;i++)
printf("%d//",time2[i]);
for (;i<6;i++)
printf("%d:",time2[i]);

printf("\nThe time3 is:");
for (i=0;i<3;i++)
printf("%d//",time3[i]);
for (;i<6;i++)
printf("%d:",time3[i]);

}



我在tc2.0&&tc++3.0 for dos下运行还可以,你们试试吧,
注意:这里数据没校验,输入的数据必须正确;

33,027

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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