Jump to content

Substrair dias


tiagoalves
 Share

Recommended Posts

Olá, perciso de ajudar, como fazemos a substração de uma data, não sei se há alguma forma de fazer isto.

Agradeço a voces, que me puderem ajudar.

int dtinicio, dtfim, dia_total;
 printf("Data de aluguer\n");
 scanf("%d", &dtinicio);

 printf("Data entrega\n");
 scanf("%d", &dtfim);
dia_total = dtfim-dtinicio;

Abraços.

Link to comment
Share on other sites

Boa tarde,

Da maneira que estás a fazer não me parece que vá dar resultado... Porque não lês separadamente as "3 componentes" de uma data (dia, mês, ano), e fazes as operações a seguir ??

Aqui fica uma dica:

int ddinicio, dminicio, dainicio, ddfim, dmfim, dafim, dia_total, dtd, dtm, dta;	
   do
 {
 printf("Data de aluguer no seguinte formado: dia mês ano ddmmyy\n");
  } while (scanf("%d %d %d %d", &ddinicio, &dminicio, &dainicio)!=3);

Cordiais cumprimentos,

Apocsantos

"A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Link to comment
Share on other sites

Obrigado HappyHippyHippo e ApocSantos,

A minha intenção é esta; Queria substrair a data de inicio e datafim, e ele me devolva total em dias, por exemplo(dt inicio=2012-12-12, dtfim= 2012-12-14, e ele me devolve 2 dias),

int valdata(char *data) {
int ano = 0, mes = 0, dia = 0;
char mesExt[20], meses[][4] = {"jan", "fev", "mar", "abr", "mai", "jun",
							 "jul", "ago", "set", "out", "nov", "dez"};
int i;
// obtenção dos componentes da data
if(sscanf(data, "%d %s %d", &dia, mesExt, &ano)== 3) { // 25 Dez 2007
 mesExt[3] = '\0';
 i = 0;
 while(mesExt[i] = tolower(mesExt[i++])); // conversao do mes para caracteres minusculos
 for(i=0; i < 12; i++)
	 if(strstr(mesExt, meses[i])) {
		 mes = i+1; break;		 // identifica o mês como numérico
	 }
 if((mes == 0) && (i = 12))		 // não encontrou o mês
	 return 0;
}
else
 if(sscanf(data, "%d/%d/%d", &ano, &mes, &dia) != 3) // 2007/12/25
	 if(sscanf(data, "%d-%d-%d", &ano, &mes, &dia) != 3) // 2007-12-25
		 return 0;
// validação da data
if((ano < 1590) || (ano > 9999))	 // ano no calendário gregoriano
 return 0;
if((mes < 1) || (mes > 12))			 // mês inválido
 return 0;
if((dia < 1) || (dia > 28))			 // casos particulares dos dias
 switch(mes) {					 // dos meses
	 case 2:
		 if(!((!(ano%4) && (ano%100)) || !(ano%400)) || dia > 29)
			 return 0;
	 case 4:
	 case 6:
	 case 9:
	 case 11:
		 if(dia > 30)
			 return 0;
	 default:
		 if(dia > 31)
			 return 0;
 }
return (ano * 10000 + mes * 100 + dia);
}
void val_pagar(char dtaluguer, float prec, char dtentrega, int dia_total, float preco)
{
char *data;
printf("Preco por dia");
scanf("%f", &prec);
 do{
	 printf("Data de aluguer\n");
	 scanf("%c", &fdtaluguer);
 }while(.dtaluguer==valdata(data)==0);
do{
 printf("Data entrega\n");
 scanf("%c", &dtentrega);
 }while((dtentrega==valdata(data)==0) && (dtentrega<= fdtaluguer));
dia_total = dtentrega - dtaluguer;
preco = prec * dia_total;
}

Obrigado

Link to comment
Share on other sites

#include <time.h>

struct tm time1, time2;
time_t time_int_1, time_int_2;
double diff;

memset(&time1, 0, sizeof(struct tm));
memset(&time2, 0, sizeof(struct tm));

time1.tm_year = ano1 - 1900;
time1.tm_mon = mes1 - 1;
time1.tm_mday = dia1;
time_int_1 = mktime(&time1);

time2.tm_year = ano2 - 1900;
time2.tm_mon = mes2 - 1;
time2.tm_mday = dia2;
time_int_2 = mktime(&time2);

diff = diffdate(time_int_2, time_int_1);

printf("diferenca em segundos : %lf\n", diff);
printf("diferenca em dias : %lf\n", diff/3600);

IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.