Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 21
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2001
    Messaggi
    1,471

    calcolo differenza giorni

    Ho due date in questo formato :

    $datearr = "2006/02/10";
    $datepar = "2006-03-09";

    Come posso calcolare la differenza in giorni ?

  2. #2
    codice:
    select to_days('2006-03-09') - to_days('2006-02-10') as diff  from ...etc.
    se invece hai mysql >= 4.1 ...
    codice:
    SELECT DATEDIFF('2006-03-09', '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)


    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  3. #3
    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..

  4. #4
    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..

  5. #5

    x Mastergirza

    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:

    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.                                             #
    da notare che "$ds" = obj DataStart e "$de" = obj DataEnd.
    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!

  6. #6
    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.

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2001
    Messaggi
    1,471
    quella di mastergiraz va + che bene per il mio scopo



    sono molto interessanti per il futuro anche quella di piero.mac in mysql

  8. #8
    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
    non si tratta di gara... ma di un limite.

    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.

  9. #9
    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!

  10. #10
    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!
    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.

    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:
    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);
    
    ?>
    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.

    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.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.