Date e operazioni aritmetiche

Veronica Auretta

Nuovo Utente
21 Apr 2015
25
0
0
Salve, ho un problema... non riuscirò mai a capire come funziona la gestione delle date in php.

Ho una data che richiamo dal db, tipo "date"... che chiamerò
PHP:
$data['scadenza']
a questa data dovrei aggiungere un intervallo di tempo di 10 giorni e poi mostrare a video quanto manca alla scadenza dei 10 giorni.

Es: se la data del db è 05/11/2015, aggiungo 10 giorni... 15/11/2015 vorrei sapere alla data odierna quanti giorni mancano al 15/11... cioè oggi 9, domani 8 e così via. Com'è possibile farlo? Ho provato in molti modi, sbagliando, le date sono un msitero per me ):
 
Puoi farlo direttamente quando estrai le date dal db..

Codice:
SELECT DATEDIFF('2014-11-30','2014-11-29')
Il risultato di questo select sarà 1

Al posto delle date puoi utilizzare una variabile php o anche
Codice:
SELECT DATEDIFF(CURDATE(),'2014-11-29')

Che sta per la data corrente

La stessa cosa funziona in questa situazione:
Codice:
SELECT DATEDIFF('2014-01-28 11:41:14', '2014-01-27')

Vedi anche questo articolo..

https://www.mrw.it/php/differenza-date-php-creiamo-funzione-datediff_7537.html
 
Ultima modifica:
Grazie per la risposta celere, ho guardato anche la funzione che mi hai linkato e sembrano utili, però ho un problema, io devo aggiungere dieci giorni alla data che estraggo dal db ed è questo il mio problema principale. Potresti farmi un esempio pratico di come, estratta la data, posso aggiungere 10 giorni e poi fare la differenza tra la data corrente e questa? in modo che mi esca una sorta di conto alla rovescia...
 
Prova quest astringa che ho costruito.. Vediamo se funziona.. non l'ho provata E' SPERIMENTALE uhauhaa.
Prova sta roba qui :P
PHP:
<?php
$sql = 'SELECT DATEDIFF(CURDATE(),(DATE_ADD((SELECT data_db FROM tabella), INTERVAL 10 DAY)))';

//il risultato dovrebbe essere la differenza tra la (data di oggi - (la data estratta +10 giorni ))
?>

ovviamente sostituisci data_db con la data da ricercare nel db e tabella con la rispettiva tabella, fammi sapere se funziona ovviamente.. Dopo tabella puoi aggiungere un WHERE così:

PHP:
<?php
$sql = 'SELECT DATEDIFF(CURDATE(),(DATE_ADD((SELECT data_db FROM tabella WHERE nomeutente = "giovani"), INTERVAL 10 DAY)))';

?>
Ovviamente anche qui al posto di WHERE nomeutente = "giovani" puoi mettere la condizione che più ti aggrada..
 
Ultima modifica:
Allora ho fatto qualche test e modificato la differenza e funziona.. Io ho usato PDO, ovviamente l'ho confrontato con una data che avevo su un mio db:
PHP:
<?php
include 'connection.php';
$sql = 'SELECT DATEDIFF((DATE_ADD((SELECT data FROM blog WHERE data = "2015-09-17"), INTERVAL 10 DAY)),CURDATE()) AS count'; 
$result = $pdo->query($sql);
$test = $result->fetch( PDO::FETCH_ASSOC );
echo $test['count']; 

//il risultato nel mio caso è "-40" che sono i giorni passati da quando ho scritto l'articolo +10 con data = "2015-09-17", se avessi messo una data futura sarebbe apparso un numero positivo.. 
?>
 
Ultima modifica:
Premetto che so cosa sia il PDO (ho letto qualcosa giusto adesso) e non l'ho mai utilizzato... questo è l'errore che riscontro

Fatal error: Call to a member function query() on a non-object in bla/bla/bla.php on line tot

Ovviamente è proprio la riga dove ho inserito il codice che hai postato sopra.
 
ciao
senza fare tante interrogazioni al db e la scadenza ti serve solo per essere visualizzata a monitor
PHP:
<?php
function differenza($d){
	$ex=explode("/", $d);//$ex[0] gg, $ex[1] mm, $ex[2] anno
	//se separatore diversi da / esempio il punto
	//$ex=explode(".", $d);
	$scad=mktime(0,0,0,(int)$ex[1],(int)$ex[0],(int)$ex[2]);//trasformata in timestamp
	$attuale=time();//in timestamp
	return (int)(($scad-$attuale)/(24*60*60));//giorni
}
//estrazione dal db
$data['scadenza']="05/11/2015";//ipotesi data estratta
$scadenza=differenza($data['scadenza']);
if($scadenza >=0){
	echo "l'abbonamento scadrà tra $scadenza giorni";
}else{
	echo "l'abbonamento è scaduto da ". abs($scadenza)." giorni";
}
?>
output (oggi 06/11/2015)
l'abbonamento è scaduto da 1 giorni
 
Come sempre grande borgo italia ;), in effetti avevo pensato al timestamp ma nn ero sicuro dell'output del db.. :P


Saluti.
G.G.
 
Ho provato il codice e funziona, ho fatto solo una piccolissima modifica perché a me serviva avere il conto alla rovescia dei 10 giorni.

PHP:
$rimasti = 10+($scadenza);
if($rimasti>=0){	
    echo "l'abbonamento scadrà tra ".$rimasti." giorni";}

Così pare che vada! Grazie ad entrambi, però mi piacerebbe comunque sapere quell'altro metodo in che modo si potrebbe utilizzare, potrebbe tornare utile!
 
Ultima modifica:
Io personalmente lo utilizzo per eliminare offerte scadute giornalmente. Ho settato dei cron job che ogni mattina provvedono ad eliminare, tramite una query simile, tutte le offerte più vecche di 7gg. In questo caso la selezione dal db è anche necessaria.


Saluti.
G.G.
 
Ultima modifica:
ciao
senza fare tante interrogazioni al db e la scadenza ti serve solo per essere visualizzata a monitor
PHP:
<?php
function differenza($d){
	$ex=explode("/", $d);//$ex[0] gg, $ex[1] mm, $ex[2] anno
	//se separatore diversi da / esempio il punto
	//$ex=explode(".", $d);
	$scad=mktime(0,0,0,(int)$ex[1],(int)$ex[0],(int)$ex[2]);//trasformata in timestamp
	$attuale=time();//in timestamp
	return (int)(($scad-$attuale)/(24*60*60));//giorni
}
//estrazione dal db
$data['scadenza']="05/11/2015";//ipotesi data estratta
$scadenza=differenza($data['scadenza']);
if($scadenza >=0){
	echo "l'abbonamento scadrà tra $scadenza giorni";
}else{
	echo "l'abbonamento è scaduto da ". abs($scadenza)." giorni";
}
?>
output (oggi 06/11/2015)
Stavo dando un'occhiata alla funzione, per cercare di imparare sempre qualcosa di nuovo :D
Notavo che nella trasformazione della data tramite mktime() hai utilizzato anche (int) prima della variabile. Per me era una cosa nuova, immaginavo che servisse a rendere intero qualcosa, e così per imparare qualcosa sono andato a cercarlo ed ecco il risultato:

PHP:
$var = '1a';

echo $var;               // 1a
echo (int) $var;     //1

In questo caso, essendo la data formata solo da numeri perchè l'hai usato? Piccola curiosità ;P
 
ciao
(int) serve a forzare ad intero una stringa di carattare, se la stringa inizia per un numero viene preso questo unmero
guarda i vari risultati
PHP:
<?php
$var = '1a';
echo $var;// 1a
echo (int)$var;//1
$var = 'aa';
echo $var;// 1a
echo (int)$var;//0 (false)
$var = 'a7';
echo $var;// a7
echo (int)$var;//0 (false)
$var = 12.355;//float
echo $var;// 12.355
echo (int)$var;//12
?>
la funzione mktime() richiede come parametri numeri interi, quindi per sicurezza se la data proviene da un input lo forzo ad intero, anche se andrebbero fatti dei controlli a monte, se al posto dell'echo tu avessi usato var_dump($var) avresti visto anche come il tipo si trasforma
 
Qualora dovesse interessarti ho trovato anche quest'altra funzione.. Sembra molto efficace:

PHP:
<?php
$date1=date_create("2013-03-15");
$date2=date_create("2013-12-12");
$diff=date_diff($date1,$date2);
echo $diff->format("%R%a days");
?>

Risultato: +272 days
 

Discussioni simili