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.