Newsgroup: it.comp.lang.c++
Titolo: manipolazione date

Salve a tutti del Ng,
mi chiedevo se esistesse una qc fuzione di una qc libreria che data una data
potesse calcolare la data di N giorni successivi, considerando mesi
28/29/30/31 (quindi anche bisestili).
Esempio 12/12/2003 + 20 = 1/1/2004.
oppure devo implementare la cosa a mano?
Grazie dell'info.
Max

 bisestili).
Dovrebbe fare al caso tuo boost::gregorian
Ciao
Gian Michele


Scusa potresti farmi un esempio di utilizzo? Non ho trovato nulla in
proposito.
Grazie ancora.
Max.

 proposito.
Ho letto un po' in giro ed ho scoperto che si tratta di librerie aggiuntive.
Io cercavo una soluzione tra le librerie standard perchè devo far girare il
programma sul pc del professore e non ho idea se le abbia istallate (né
quanto ne gradisca l'uso).
Se non c'è nulla farò qcs a mano.
Grazie comunque.
Max

 Se non c'è nulla farò qcs a mano.
Puoi sempre prenderle ad esempio, visto che e' disponibile tutto ed e'
possibile che entrino a far parte dello standard.
Mi viene anche in mente che nell'appendice su <locale> di Stroustrup,
liberamente scaricabile dal suo sito
(
http://www.research.att.com/~bs/3rd.html
), c'e' uno scheletro di classe
Date, ma non mi pare che siano implementate funzioni per operazioni
aritmetiche.
Ciao
Gian Michele

 nulla in proposito.
Se ti scarichi la boost e' letteralmente piena di esempi.
Pigro, eh? :-)
Ciao
Gian Michele

 Esempio 12/12/2003 + 20 = 1/1/2004.
Eccoti due funzioncine (che ho testato personalmente per TUTTE le date 
comprese tra l'anno 1 e l'anno 3500). (Non andare sotto l'anno 1d.C.)
La prima calcola il numero di giorni che intercorrono tra una data
fissa di riferimento e la data (D/M/YYYY) che gli passi tu.
(La data di riferimento non ha importanza). La seconda fa il viceversa.
(Gli devi passare gli indirizzi di giorno mese e anno)
Ecco allora che per calcolare il numero di giorni intercorso fra due
date ti basta fare
diff = DayToN(d2,m2,y2) - DayToN(d1,m1,y1);
mentre per conoscere la data di N giorni successivi a d1/m1/y1,
ti basta fare:
NToDay( DayToN(d1,m1,y1)+N, &d2, &m2, &y2);
Le funzioni sono in C e tu le puoi "wrappare" facilmente in qualunque
classe o funzione c++ che ti pare. Ciao.
g.
int DayToN(int D, int M, int Y)
{
   int Z;
   Z = Y+(M-14)/12;
   if (M<3) M=M+12;
   return D+((979*M-2918)>>5)+365*Z+Z/4-Z/100+Z/400;
}
void NToDay(int Z, int *d, int *m, int *y)
{
   int A,Y,C;
   A = (int)((Z-0.25)/36524.25);
   *y = (int)((Z-0.25+A-(A>>2))/365.25);
   C = Z+A-(A>>2)-(int)(365.25* *y);
   *m = (5*C + 456)/ 153;
   *d=C-(153* *m -457)/5;
   if (*m > 12){(*y)++; (*m)-=12;}
}

Ho dimenticato di dire che le funzioni che ti
ho proposto sono l'implementazione di un
metodo di Peter Baum   ( 
http://home.capecod.net/~pbaum/
 )
e che ho controllato il funzionamento con il seguente programmino.
Ari-ciao.g.
//=================================================================================
#include<stdio.h>
#include<stdlib.h>
int main(int argc, char *argv[])
{
   int y,m,d,z,b,lim;
   int ny,nm,nd;
// tutti gli anni da 1 a 3500
   for (y=1; y<=3500; y++)
     {
// metto b=1 se l'anno e' bisesto
       if ((y % 400==0) || ((y%4 == 0) && (y%100 !=0))) b=1; else b=0;
       for (m=1; m<=12; m++)
	{
// lim e' il numero di giorni del mese m
	  if (m==2) lim=28+b;
	  else if (m==11 || m==4 || m==6|| m==9) lim=30;
	  else lim=31;
	  for (d=1; d<=lim; d++)
	    {
// controllo se torna indietro bene
                 z=DayToN(d,m,y);
                 NToDay(z,&nd,&nm,&ny);
		if (ny !=y || nm != m || nd != d)
		  {
		    printf("Errore in %d %d %d\n",d,m,y); return 1;
		  }
	    }
	}
     }
  printf("OK\n");
  return 0;
}
//=================================================================================

Grazie mille per l'aiuto;-)
Max

 e che ho controllato il funzionamento con il seguente programmino.
Compilato con Borland C++ 5.5.1 mi dà
Errore in 1 3 7
Invece con il DJGPP mi dà
OK
Da che può dipendere?
EMG
--
EMAG Software Homepage:     
http://www.emagsoftware.it
The EMG's ZX-Spectrum Page: 
http://www.emagsoftware.it/spectrum
The Best of Spectrum Games: 
http://www.emagsoftware.it/tbosg

 Da che può dipendere?
Ho risolto l'arcano (grazie anche al fatto che sulla mia
macchina con dualboot ho il gcc E il borland 5)
putroppo c'e' un passaggio in cui la NToDay (per la
data incriminata, ma presumo anche per altre) si trova
ad effettuare questa operazione:
(2557 - 0.25) / 365.25
e poi fare il cast (con troncamento quindi) ad integer.
Ora, i numeri in questione, cioe' 2556.75 e 365.25 sono perfettamente
rappresentabili in binario. Cosi' come il risultato (che e' 7 tondo tondo).
Per qualche motivo che non ho il tempo di indagare, evidentemente
il borland fa qualche riarrangiamento delle operazioni per cui ottiene 
invece di 7 qualcosa del tipo 6.99999999 che poi troncato da 6 invece di 
7...
Per troncare (e' il caso di dirlo) la testa al toro, si possono 
sostituire le due espressioni Z-0.25 che appaiono in NToDay() con le
espressioni  Z-0.249.
In quel modo mi sembra che funzioni sia sul Borland sia sul gcc.
Mi scuso con la persona alla quale avevo suggerito queste funzioni...
che non funzionavano...
ciao,
g.