PDA

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.