Neste site voce vai encontrar tutoriais de software livre e tambem alguns para Windows, sistema de controles de frequência e usuários desenvolvidos em PHP e MySQL, diversão, muita coisa sobre pescarias com albuns de fotos e também as viagens que pude registrar até agora.

Especialista em Tecnologia da Informação

Funções em C ANSI

Diferença entre Datas


#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <time.h>
#include "funcoes.h"
#include "natuser.h"
#define  BRANCO	  32
 
char valorcompactado[10];
 
int  CompactaCOMP3(char *);
long DiferencaDatas(char *, char *);
 
/*----------------------------------------------------------------------*
 *									*
 *	Modulo .................. PB19070A				*
 *	Autor ................... Lercio Teotonio Gontijo		*
 *	Data .................... Julho de 1994				*
 *	Local ................... PRODABEL - BELO HORIZONTE		*
 *	Funcao .................. DIFERENCA ENTRE DATAS         	*
 *									*
 *----------------------------------------------------------------------*/
long PB19070A (WORD nparm, BYTE **parmptr, FINFO *parmdec)
{
  long result;
  char data1[7], data2[7], str[4], string[9];
  data1[6] = data2[6] = valorcompactado[9] = '/0';
  strcpy(string,"999999");
  CompactaCOMP3(string);
  memmove((char *)parmptr[2],&valorcompactado,4);
 
  /* Teste se recebeu somente 3 parametros */
 
  if (nparm != 3)
     return 1;
 
  /* Recupera as datas (data1 e data2)	*/
 
  memmove ((char *) &data1, (char *) parmptr[0], 6);
  memmove ((char *) &data2, (char *) parmptr[1], 6);
 
  if ((!ConsisteData(data1,'G')) || (!ConsisteData(data2,'G')))
     return 1;
 
  result = DiferencaDatas(data1,data2);
  if (result > 999999)
     return 1;
 
  sprintf(string,"%+08ld",result);
  CompactaCOMP3(string);
 
  memmove((char *) parmptr[2], (char *) &valorcompactado, 4);
 
  return 0;
}
/*
************* fim do módulo principal ***************
*/
 
long DiferencaDatas(char *data1, char *data2)
{
   char *ptr, str[5], str1[7], str2[7];
   int anos1, anos2, dias1, dias2;
   long result;
 
   strcpy(str1,data1);
   GregorianaJuliana((char *)&str1);
   data1 = str1;
   strcpy(str2,data2);
   GregorianaJuliana((char *)&str2);
   data2 = str2;
 
   ptr = data1;
   strncpy(str,data1,3);
   anos1 = atoi(str);
   ptr += 3;
   dias1 = atoi(ptr);
 
   ptr = data2;
   strncpy(str,data2,3);
   anos2 = atoi(str);
   ptr += 3;
   dias2 = atoi(ptr);
 
   result = (anos1 * 365 + dias1) - (anos2 * 365 + dias2);
 
   if (anos1 > anos2)
   {
      for(;anos1 > anos2;anos2++)
         if (anos2 % 4 == 0)
            result++;
   }
   else
      for(;anos1 < anos2;anos1++)
         if (anos1 % 4 == 0)
            result--;
 
   return(result);
 
}
 
 
CompactaCOMP3(char *num)
{
   char *pointer, string[8];
   int i, k;
   if (strlen(num) > 8) 
      return 0;
   memset(string,0,8);
   k = 7;
   i = strlen(num) - 1;
   string[k] = 12;
   if (num[0] == '-')
      string[k]++;
   string[k] += 16 * (num[i] - 48); 
   for(;i>1;i-=2,k--)
   {
      string[k-1] = num[i-1] - 48;
      if (i-1 > 0)
         string[k-1] += 16 * (num[i-2] - 48);
   }
   k = (strlen(num) - 1) / 2 + 1;
   if (k < 4)
      k = 4;
   pointer = string;
   pointer += 8 - k;
   memmove(valorcompactado,pointer,k);
   return 1;
}