Ho due date in questo formato :
$datearr = "2006/02/10";
$datepar = "2006-03-09";
Come posso calcolare la differenza in giorni ?
Ho due date in questo formato :
$datearr = "2006/02/10";
$datepar = "2006-03-09";
Come posso calcolare la differenza in giorni ?
se invece hai mysql >= 4.1 ...codice:select to_days('2006-03-09') - to_days('2006-02-10') as diff from ...etc.
se invece fai tutto su php usa list, explode, mktime e ricavato unix timestamp dividi per (60 * 60 * 24)codice:SELECT DATEDIFF('2006-03-09', '2006-02-10') AS diff from ... etc.
![]()
Il silenzio è spesso la cosa migliore. Pensa ... è gratis.
qesto è quanto mi è venuto in mente, sicuramente può essere migliorato
magari anche aggingendo un checkdate() e sistemando tutto come funzione..
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<title>Giraz - Date test</title>
</head>
<body>
<h1>Operation with DATEs</h1>
<?php
$datearr = "2006/02/10";
$datepar = "2006-03-09";
echo "<h2>Initial values</h2>";
echo "
date arr: ".$datearr."</p>";
echo "
date par: ".$datepar."</p>";
$datearr = strtotime($datearr);
$datepar = strtotime($datepar);
echo "<h2>Parsed values</h2>";
echo "
date arr: ".$datearr."</p>";
echo "
date par: ".$datepar."</p>";
echo "<h2>Difference Results</h2>";
if($datearr)
{
$difference = ceil(($datepar-$datearr)/86400);
echo "
".$difference."</p>";
}
else
{
echo "<h3>ERROR during checkdate</h3>";
}
?>
</body>
</html>
facci sapere..
ops,
nel codice che ho mandato mi è rimasto a metà un if...else che dovrebbe controllare che le date siano corrette con checkdate o una funzione simile..
Ciao!
La tua soluzione è perfetta. Però solamente per date che abbiano il time stamp! Prima del 70 "strToTime" restituisce sempre "-1"...
Come si fa?
Io ho dovuto costruire una funzione piuttosto complessa... Praticamente come prima cosa controllo se le 2 date hanno timestamp. In questo caso è facile e si fa come hai detto tu oppure con la differenza di timestamp.
Nel caso non ci siano a disposizione i ts la cosa diventa un casino...
Posto qui un mio pezzo di codice. E' abbastanza lungo e utilizza funzioni esterne il cui nome da comunque un'idea precisa di cosa fanno:
da notare che "$ds" = obj DataStart e "$de" = obj DataEnd.codice:} else { # In questo caso non è disponibile il timeStamp per almeno una delle due date. # # E' necessario procedere al calcolo manuale dell'intervallo. # $ss = 0; if ( $ds->anno == $de->anno ) { # L'intervallo è compreso in un'unico anno. # if ( $ds->mese == $de->mese ) { # L'intervallo è compreso in uno stesso mese. # if ( $ds->giorno == $de->giorno ) { # L'intervallo è compreso in uno stesso giorno. # if ( $ds->ora == $de->ora ) { # L'intervallo è compreso nella stessa ora. # if ( $ds->minuto == $de->minuto ) { # L'intervallo è di soli secondi. Calcolo diretto. # $ss = $de->secondo - $ds->secondo; } else { # L'intervallo è posto tra un minuto e l'altro. Devo calcolare# # il numero di secondi al termine del minuto per la prima data# # e il numero di secondi dall'inizio del minuto per la seconda# $ss = $ds->secTo60() + $de->secondo; } } else { # L'intervallo è posto in ore differenti. Devo calcolare il numero# # di secondi necessari a completare l'ora della data di partenza e# # il numeri di secondo trascorsi dalla data di arrivo. # $ss = $ds->secToHour() + $de->secFromHour(); } } else { # L'intervallo è compreso in giorni diversi dello stesso mese. Devo # # calcolare il numero di secondi necessari a completare il giorno, il # # numero di giorni dell'intervallo ed il numero di secondi passati # # dall'inizio del giorno per la seconda data. # $ss = $ds->secToDay() + ( $de->giorno - ( $ds->giorno + 1 ) ) * 86400 + $de->secFromDay(); } } else { # L'intervallo è esteso su mesi differenti. In questo caso è necessario # # calcolare il numero di secondi necessari allo scadere del mese per la # # prima data, il numero di secondi passati dall'inizio del mese per la # # seconda ed il numero di secondi di intervallo dei mesi in mezzo. # $ss = $ds->secToMonth() + $de->secFromMonth(); # Ok, resta da calcolare l'intervallo dei mesi. # for ( $i = $ds->mese+1; $i < $de->mese; $i++ ) { $ss += xDataTs_monthSec($i, $this->anno); } } } else { # L'intervallo è esteso a più anni. Qui la faccenda si complica di brutto. # # Come prima cosa è necessario calcolare quanti secondi mancano all'anno. # $ss = $ds->secToYear(); # Come seconda cosa è necessario calcolare quanti secondi sono passati # # dall'inizio dell'anno della seconda data. # $ss += $de->secFromYear(); # Ora è necessario calcolare il numero di secondi degli anni in mezzo! # for ( $i = $ds->anno+1; $i<$de->anno; $i++ ) $ss += xDataTs_yearSec($i); $ss-=3600; // Non so perchè ma il calcolo aggiunge un'ora :-) ################# } } // Fine calcolo intervallo in secondi. #
Questo è una porzione di un metodo di un oggetto mio.... Ancora da testare e provare... Comunque dovrebbe fornire un calcolo abbastanza preciso in caso di assenza da time stamp.
Ciao!
By Pegoraro Marco
http://adessoweb.biz- AdessoWEB - Siti web professionali a prezzo accessibile!
http://consulenza-web.com- Il mio blog!
Ma se hai a disposizione mysql perche' non fare tutto con una query? Non ti serve mica una tabella... basta la connessione.... ma forse e' troppo semplice, poco "professionale".
![]()
Il silenzio è spesso la cosa migliore. Pensa ... è gratis.
quella di mastergiraz va + che bene per il mio scopo
![]()
sono molto interessanti per il futuro anche quella di piero.mac in mysql
non si tratta di gara... ma di un limite.Originariamente inviato da lilo
quella di mastergiraz va + che bene per il mio scopo
![]()
sono molto interessanti per il futuro anche quella di piero.mac in mysql
I formati TIMESTAMP non sono l'ideale per trattare le date, specie se queste possono estendersi a prima del 1970. Si tratta di utilizzare uno strumento buono per tutte le stagioni e non un algoritmo diverso a seconda della stagione (intesa come periodo).
Si puo' tranquillamente fare in php senza usare il timestamp. tutto qui.
![]()
Il silenzio è spesso la cosa migliore. Pensa ... è gratis.
x piero.mac:
potresti spiegarci come fare? Mi è chiaro l'utilizzo di mysql. Però da php non ho trovato altri sistemi se non quello di analizzarmi le varie casistiche...
Ciao!
By Pegoraro Marco
http://adessoweb.biz- AdessoWEB - Siti web professionali a prezzo accessibile!
http://consulenza-web.com- Il mio blog!
Quando si programma bisogna ragionare semplice. Piu' ci si contorce e piu' ci si annoda. Nel caso di questo thread la richiesta era calcolare in giorni ... il delta in giorni tra due date.Originariamente inviato da Marburg
x piero.mac:
potresti spiegarci come fare? Mi è chiaro l'utilizzo di mysql. Però da php non ho trovato altri sistemi se non quello di analizzarmi le varie casistiche...
Ciao!
1) Prima risposta una query elementare...
codice:select to_days('2006-03-09') - to_days('2006-02-10') as diff oppure SELECT DATEDIFF('2006-03-09', '2006-02-10') AS diff
2) Tu la vorresti vedere in php svincolata dal unix timestamp.... allora si calcola senza unix timestamp.... mi pare che possa avere valenza solo come esercizio didattico e nulla piu' perche' di solito una delle due date e' messa in una tabella del db.
anyway.... ti propongo la seguente:
E' cosi' semplice questa funzione che si commenta da sola. L'uso di mktime non e' legato a UNIX TIMESTAMP difatti l'anno potrebbe essere uno qualunque nel range ammesso ma non bisestile.codice:<?php $data_maggiore = '2005/03/01'; $data_minore = '1950/01/01'; function contaGiorni($data_maggiore, $data_minore) { $a = explode('/', $data_maggiore); $da = explode('/', $data_minore); $bisesto = 0; $n_anni = ($a[0] - $da[0]); for($i = $da[0]; $i <= $a[0]; $i++) { if ($i % 4 == 0) $bisesto++; } if($da[1] > 2 AND $da[0] % 4 == 0) $bisesto--; if($a[1] < 2 AND $a[0] % 4 == 0) $bisesto--; $n_giorni = $n_anni * 365 + $bisesto; $giorni_da = date('z', mktime(0,0,0, $da[1], $da[2], 1970)); $giorni_a = date('z', mktime(0,0,0, $a[1], $a[2], 1970)); return $tot = $n_giorni - $giorni_da + $giorni_a; } print contaGiorni($data_maggiore, $data_minore); ?>
potrebbe esserci qualche errore in particolari date di anni bisestili... forse.... non l'ho provata se non in modo molto massimale. Uso mysql di solito per le date.
![]()
Il silenzio è spesso la cosa migliore. Pensa ... è gratis.