View Full Version : [C/C++] Libreria ctime (time.h)
zanardi84
16-07-2011, 12:15
Ho cercato su internet un po' di documentazione su questa libreria.
Un utile uso sarebbe quello di confrontare alcune date senza doversi tirare troppo matti :D
Non ho capito però come implementarla.
In particolare, vorrei costruire due date, confrontarle tra loro e contare i giorni tra le due.
Mi date una mano?
starfred
17-07-2011, 13:23
Detta proprio molto grezzamente
time_t now = time(NULL);
string time_string(ctime(&now));
time_string.erase(time_string.find('\n', 0), 1);
ora in time_string hai una data del tipo
Sun Jul 17 14:22:42 2011
a questo punto puoi smanettare con le stringhe quanto vuoi :D
Supdario
17-07-2011, 14:00
Ho cercato su internet un po' di documentazione su questa libreria.
Un utile uso sarebbe quello di confrontare alcune date senza doversi tirare troppo matti :D
Non ho capito però come implementarla.
In particolare, vorrei costruire due date, confrontarle tra loro e contare i giorni tra le due.
Mi date una mano?
Esempio preparato al volo che confronta due date e restituisce il numero di giorni di differenza.
static struct tm data1, data2;
time_t a, b;
int d, m, y;
printf("Inserisci prima data: ");
scanf("%d/%d/%d", &d, &m, &y);
data1.tm_mday = d; //Range [1-31]
data1.tm_mon = m - 1; //Range [0-11]
data1.tm_year = y - 1900; //Range >= 1900
printf("Inserisci seconda data: ");
scanf("%d/%d/%d", &d, &m, &y);
data2.tm_mday = d;
data2.tm_mon = m - 1;
data2.tm_year = y - 1900;
printf("La differenza tra le due date e' di %lf giorni\n", abs(difftime(mktime(&data1), mktime(&data2))/86400));
zanardi84
18-07-2011, 17:18
Esempio preparato al volo che confronta due date e restituisce il numero di giorni di differenza.
static struct tm data1, data2;
time_t a, b;
int d, m, y;
printf("Inserisci prima data: ");
scanf("%d/%d/%d", &d, &m, &y);
data1.tm_mday = d; //Range [1-31]
data1.tm_mon = m - 1; //Range [0-11]
data1.tm_year = y - 1900; //Range >= 1900
printf("Inserisci seconda data: ");
scanf("%d/%d/%d", &d, &m, &y);
data2.tm_mday = d;
data2.tm_mon = m - 1;
data2.tm_year = y - 1900;
printf("La differenza tra le due date e' di %lf giorni\n", abs(difftime(mktime(&data1), mktime(&data2))/86400));
Quindi, assegno elementi alle due struct che rappresentano le due date.
Non riesco a capire cosa sia "abs" e come mai hai dichiarato le variabili a e b.
Supdario
18-07-2011, 19:52
"abs" è semplicemente il valore assoluto, cioè se il risultato è negativo lo trasforma in positivo. :asd: (Perché se metti la seconda data maggiore della prima viene un numero negativo)
In ogni caso sì, basta assegnare i valori alle strutture ed usare la funzione "mktime" per trasformare le due date in formato UNIX.
Il formato UNIX non è altro che il conteggio dei secondi passati dal 1970, ed è il modo più usato per rappresentare le date in informatica.
In poche parole il tipo time_t non è altro che un intero (a 32 o 64 bit), semplicemente la scrittura "time_t" è un modo più standard per rappresentare questo valore. :asd: (un po' come i NULL dei puntatori)
Avendo le due date in formato UNIX, ti basta sottrarle (a-b) per ottenere la differenza in secondi, e per ottenerla in giorni basterà dividere per 86400 (cioè 60*60*24). :asd:
zanardi84
18-07-2011, 20:40
"abs" è semplicemente il valore assoluto, cioè se il risultato è negativo lo trasforma in positivo. :asd: (Perché se metti la seconda data maggiore della prima viene un numero negativo)
In ogni caso sì, basta assegnare i valori alle strutture ed usare la funzione "mktime" per trasformare le due date in formato UNIX.
Il formato UNIX non è altro che il conteggio dei secondi passati dal 1970, ed è il modo più usato per rappresentare le date in informatica.
In poche parole il tipo time_t non è altro che un intero (a 32 o 64 bit), semplicemente la scrittura "time_t" è un modo più standard per rappresentare questo valore. :asd: (un po' come i NULL dei puntatori)
Avendo le due date in formato UNIX, ti basta sottrarle (a-b) per ottenere la differenza in secondi, e per ottenerla in giorni basterà dividere per 86400 (cioè 60*60*24). :asd:
Strano non funziona!
Popolo le due strutture, inserisco i giorni, i mesi e gli anni, ma mi dice sempre che la differenza è 0.
mkdiff restituisce sempre una differenza, giusto? Se una delle due date è considerata antecedente, mi restituisce il risultato negativo, giusto?
Se io evito di calcolare il modulo, posso dire che se la differenza è negativa, una data è antecedente all'altra e ho fatto il confronto. Mentre se la differenza è 0 dovrebbe significare che le due date coincidono.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.