- Home
- Categorie
- Coding e Sistemistica
- Coding
- Calcolare la differenza fra due date
-
Lo script funziona correttamente a parte il calcolare l'età in negativo. Dovresti invertire la differenza.
Fare:
[php]
$dataodierna=date ("d-m-Y");
strtotime("$dataodierna")
[/php]
è una "complicazione affari semplici"... equivale a richiamare la sola funzione time();
[php]
$differenza=(time() - strtotime("$datanascita"))/(31536000);
[/php]Per quanto riguarda il risultato errato, verifica che le tre variabili contengano effettivamente i dati da te scritti in commento.
strtotime() cerca di interpretare la tua stringa per trasformarla in un Unix timestamp.
Per evitare eventuali errate interpretazioni della stringa da parte di strtotime(), come ti ha consigliato Thedarkita, sarebbe meglio usare mktime()
[php]
mktime(0,0,0,$str_giorno,$str_mese,$str_anno)
[/php]Alessandro
-
@Magicale said:
Lo script funziona correttamente a parte il calcolare l'età in negativo. Dovresti invertire la differenza.
Fare:
[php]
$dataodierna=date ("d-m-Y");
strtotime("$dataodierna")
[/php]è una "complicazione affari semplici"... equivale a richiamare la sola funzione time();
[php]
$differenza=(time() - strtotime("$datanascita"))/(31536000);
[/php]Per quanto riguarda il risultato errato, verifica che le tre variabili contengano effettivamente i dati da te scritti in commento.
strtotime() cerca di interpretare la tua stringa per trasformarla in un Unix timestamp.
Per evitare eventuali errate interpretazioni della stringa da parte di strtotime(), come ti ha consigliato Thedarkita, sarebbe meglio usare mktime()
[php]
mktime(0,0,0,$str_giorno,$str_mese,$str_anno)
[/php]Alessandro
Allora...ho fatto cosi'[PHP]
$datanascita="$str_giorno-$str_mese-$str_anno";$differenza=(strtotime("$datanascita") - time())/(31536000);
echo "$differenza";
[/PHP]
in questo caso mi da 26.3927778729 quindi pare che funzioni...solo che non vorrei tutti quei numeri dopo il 26...
invece facendo cosi'
[PHP]
$datanascita="$str_giorno-$str_mese-$str_anno";$differenza=(strtotime("$datanascita") - mktime(0,0,0,$str_giorno,$str_mese,$str_anno))/(31536000);
echo "$differenza";
[/PHP]mi da 51.2
-
mktime() devi usarlo al posto di strtotime().
La differenza corretta è:
[php]
$differenza=(time() - mktime(0,0,0,$str_giorno,$str_mese,$str_anno))/(31536000);
[/php]Per avere solo gli anni interi puoi utilizzare la funzione intval()
[php]
$differenza=intval((time() - mktime(0,0,0,$str_giorno,$str_mese,$str_anno))/(31536000));
[/php]o forzare il risultato ad un intero con l'operatore di type casting (int)
[php]
$differenza=(int)(time() - mktime(0,0,0,$str_giorno,$str_mese,$str_anno))/(31536000);
[/php]oppure arrotondare per difetto con la funzione matematica floor();
(in questo caso il risultato sarà ancora di tipo float)
[php]
$differenza=floor((time() - mktime(0,0,0,$str_giorno,$str_mese,$str_anno))/(31536000));
[/php]La migliore è la prima soluzione
Alessandro
-
OK,ho usato questa soluzione
[PHP]
$differenza=intval((time() - mktime(0,0,0,$str_giorno,$str_mese,$str_anno))/(31536000));
[/PHP]
mi da 24 come risultato...invece dovrebbe essere 26...eppure i dati che mi ricavo sono corretti....ho controllato
$str_giorno=30
$str_mese=03
$str_anno=1982
-
Hai ragione... colpa mia che nella fretta ho messo i dati secondo l'ordine "europeo", mentre i parametri di mktime sono
(ore, minuti, secondi, mese, giorno, anno),
secondo la scrittura "americana" che segue il formato mm-gg-yyyy[PHP]
$differenza=intval((time() - mktime(0,0,0,$str_mese,$str_giorno,$str_anno))/(31536000));
[/PHP]Alessandro
-
Grazie mille,ora funziona benissimo;)
-
Sorge un problemino,oggi 23 marzo nell èta dell utente mi segna già 27,l utente compie i 27 anni il 30 marzo...io vorrei che 27 me lo segnasse appunto il giorno del compleanno...e non prima:?credo sia dovuto alla funzione intval il problemino che cerca comunque di dare un valore intero al risultato ma non ne sarei sicuro visto che togliendo intval alla stringa mi da come risultato 27.0004106418 eppure la data di nascita dell utente è 30-03-1982 ....come potrei risolvere la cosa?
-
Ciao,
il problema non è dovuto ad intval, ma agli anni bisestili per i quali non vale la corrispondenza:1 anno = 31536000 secondi
Alessandro
-
Quindi non c'è modo di risolvere...giusto?
-
C'è sempre un modo di risolvere:
[PHP]
$eta = date("Y",time())-$str_anno-(date("md",time())<($str_mese.$str_giorno));
[/PHP]Alessandro
-
Grazie!
Sei un mito;)
-
Ciao Magicale,
ho notato questo problema....praticamente ho un utente come data di
nascita uguale a 23 04 1971...perchè nel calcolo degli anni mi da un -1 invece dell ètà esatta dell utente?
-
Ciao,
se provi così:
[PHP]
$str_giorno="23";
$str_mese="04";
$str_anno="1971";
$eta = date("Y",time())-$str_anno-(date("md",time())<($str_mese.$str_giorno));
[/PHP]
Il risultato viene corretto. L'errore potrebbe essere nei dati, verifica che siano recuperati correttamente.Alessandro