[PHP] Contare numero dei giorni tra data_in e data_out

xone

Utente Attivo
4 Apr 2014
181
14
18
Salento
Salve, per il completamento del mio cms ho bisogno di scompattare due date partendo da due input e contare solo i giorni che ci sono tra le due date questo è il codice:

$arrivo = mysqli_real_escape_string($mysqli, $_POST['arrivo']);
$partenza = mysqli_real_escape_string($mysqli, $_POST['partenza']);

// ricevo le date in formato gg/mm/aaaa

// sostituisco "/" con "-" e converto le date in aaaa-mm-dd

$date_in = strtr($arrivo, '/', '-');
$date_in = date("Y-m-d", strtotime($date_in));

$date_out = strtr($partenza, '/', '-');
$date_out = date("Y-m-d", strtotime($date_out));

// ora ho $data_in e $data_out in formato aaaa-mm-dd
// devo estrapolare solo "dd" da entrambe le date e contare quanti giorni ci sono in totale ad esempio dal 15/05/2017 al 20/05/2017 sono 5 giorni, come proseguo?

Grazie in anticipo
 
Ultima modifica:
A quanto pare ho risolto in questo modo (devo verificare con certezza):

PHP:
$calc_date_in = strtr($arrivo, '/', '-');
$calc_date_in = date("d", strtotime($calc_date_in));

$calc_date_out = strtr($partenza, '/', '-');
$calc_date_out = date("d", strtotime($calc_date_out));

$notti = $calc_date_out - $calc_date_in -1;
 
ciao
potresti usare se hai php versione >= 5.3.0
PHP:
$gg=date_diff($partenza, $arrivo);//però date formato aaaa/mm/gg
però attento ad usare nel db le date nel formato gg/mm/aaaa, esempio se
partenza = 02/04/2017
e se fai uana ricerca tipo: visualizza partenze dopo il 29/03/2017 quindi la query
.... WHERE data_partenza >= '29/03/2017'
la partenza del 02/04/2017 non ti viene visualizzata, è un confronto tra stringhe e la stringa 02/04/2017 è minore di 29/03/2017, ma la data NO e quindi errore
nel db è meglio aaaa/mm/gg o il timestamp
 
visto che l'ho provata, posto anche questa soluzione che non richiede controlli e sostituzioni varie
PHP:
$arrivo   = '15/05/2017';
$partenza = '20/05/2017';

$ar = DateTime::createFromFormat('d/m/Y', $arrivo);
$pa = DateTime::createFromFormat('d/m/Y', $partenza);

$intervallo = $ar->diff($pa)->format('%d');
echo $intervallo.'<br />'."\r\n";

corretto i nomi
 
Proverò anche questa funzione, devo fare in modo però che il primo giorno sia incluso mentre dovrebbe essere escluso l'ultimo, per questo io stavo pensando quel -1 al conteggio. Visto che il cliente arriva il 15 e parte il 20, il 20 appunto non devo contarlo come pernotto.
 
se esegui lo script come l'ho postato, ti restituisce 5 come risultato
e gestisce correttamente 30 / 31 di fine mese o 28 / 29 di febbraio

ps, nel db meglio definire sempre i campi come "datetime" passando la data come yyyy-mm-gg,
formato che non può essere confuso dal db stesso, scambiando giorno con mese o viceversa
vedi date in formato americano

gestendo le date in questo modo sono fruibili tutte le funzioni del db relative alle date
che non lo sarebbero altrimenti
 
Ultima modifica:
ciao
se ti serve il numero delle notti basta che tu tolga 1 all'intervallo
PHP:
//....
$intervallo = $ar->diff($pa)->format('%d');
$intervallo-=1;//togli 1 a intervallo, equivalente a: $intervallo=$intervallo-1;
echo "numero notti $intervallo<br />";
//...
 
se ti serve il numero delle notti basta che tu tolga 1 all'intervallo
NO, il risultato del calcolo è 5 ovvero 15-16-17-18-19 senza togliere nulla

Cattura.PNG
 
Ciao, si il campo l'ho fatto date proprio per non avere quei problemi, faccio una verifica del vostro codice. Grazie
 
in php esiste un "mondo" per la gestione delle date,

oltre alla già citata funzione,
DateTime::createFromFormat

trovi anche la citata format, per esempio
$ar->format('Y-m-d');
ti restituisce la data in formato yyyy-mm-dd senza ricorrere a scambi e passaggi

ma soprattutto vengono gestite bene tutte le operazioni di somma e sottrazione,
con un'unica attenzione alle operazioni sui mesi quando presi individualmente
 

Discussioni simili