Trovare il numero di giorni tra due date


617

Come trovare il numero di giorni tra due date usando PHP?



6
One liner:(new DateTime("2010-01-11"))->diff(new DateTime("2019-08-19"))->days;
billynoah,

@billynoah - questa è la risposta più pulita e più semplice!
rolinger

Risposte:


907
$now = time(); // or your date as well
$your_date = strtotime("2010-01-31");
$datediff = $now - $your_date;

echo round($datediff / (60 * 60 * 24));

39
Penso che restituire un numero negativo di giorni fornisca informazioni pertinenti. E dovresti usare $your_date-$now, se vuoi che una data futura restituisca un numero intero positivo.
Tim

23
Che dire dei secondi bisestili? Non tutti i giorni hanno esattamente 24 * 60 * 60 secondi. Questo codice potrebbe essere sufficiente per scopi pratici, ma non è esatto in casi limite estremamente rari.
Benjamin Brizzi,

49
Dimentica i secondi bisestili (no, in realtà considera anche quelli) ma questo NON tiene conto delle modifiche all'ora legale! Può essere spento per un giorno intero oltre quei confini ogni anno. È necessario utilizzare le classi DateTime.
Levi,

6
@billynoah Siamo spiacenti, non sono mai tornato per aggiornare il mio commento. Devi stare attento con i fusi orari dell'ora legale. Se si confronta una data con l'ora legale con una data senza di essa, invece di restituire 7 giorni restituisce 6,9 ​​giorni. Prendendo la parola restituisce 6 invece di 7.
Alex Angelico,

4
Strtotime () non fallisce solo in 20 anni, ma al momento è inutilizzabile. L'OP ha specificato le date, non l'ora. Le date possono essere piuttosto vecchie. Ecco una risposta più semplice: $ NumberDays = gregoriantojd ($ EndM, $ EndD, $ EndY) - gregoriantojd ($ StartM, $ StartD, $ StartY); (per un intervallo inclusivo). A differenza della classe Datetime, Gregorian to Julian è disponibile dalla v4 in poi. L'intervallo valido è compreso tra 4714 a.C. e 9999 d.C. Fare attenzione all'ordine dei parametri funky (come se fosse necessario quell'avviso per php).
Guy Gordon,

524

Se stai usando PHP 5.3 >, questo è di gran lunga il modo più accurato per calcolare la differenza:

$earlier = new DateTime("2010-07-06");
$later = new DateTime("2010-07-09");

$diff = $later->diff($earlier)->format("%a");

14
Si noti che poiché stiamo parlando di intervalli di tempo e non di punti temporali specifici, la sintassi del formato è diversa dalla sintassi di date () e strftime (). La sintassi dell'intervallo di tempo è disponibile qui: php.net/manual/en/dateinterval.format.php
Andrew

1
o nel mio caso il numero di giorni tra è $ date2-> diff ($ date1) -> formato ("% a") - 1
xeo

13
Tieni presente che se hai orari nelle date, questo non funzionerà come ti aspetteresti. Ad esempio, se hai un intervallo di 23:30 ore ... e sono in giorni diversi, la differenza sarà 0.
Layke,

20
Se hai bisogno di un numero relativo di giorni (negativo quando $date1è anteriore $date2), usa $diff = $date2->diff($date1)->format("%r%a");invece.
Socce,

1
Qual è il formato della data in DateTime("2010-07-06")?, È Y-m-do Y-d-m?, Qual è il formato del DateTimeparametro. quale è il giorno?
151291,

165

Dalla versione 5.3 di PHP e successive, sono state aggiunte nuove funzioni di data / ora per ottenere la differenza:

$datetime1 = new DateTime("2010-06-20");

$datetime2 = new DateTime("2011-06-22");

$difference = $datetime1->diff($datetime2);

echo 'Difference: '.$difference->y.' years, ' 
                   .$difference->m.' months, ' 
                   .$difference->d.' days';

print_r($difference);

Risultato come di seguito:

Difference: 1 years, 0 months, 2 days

DateInterval Object
(
    [y] => 1
    [m] => 0
    [d] => 2
    [h] => 0
    [i] => 0
    [s] => 0
    [invert] => 0
    [days] => 367
)

Spero che sia d'aiuto !


8
Sì, questa sembra migliore della risposta accettata, che in alcuni casi non funziona. Come: $ from = '2014-03-01'; $ a = '2014/03/31';
MBozic,

1
Sono d'accordo, è così facile da seguire e funziona benissimo !!! Basta non dimenticare di usare la funzione date_default_timezone_set () o ti darà strani risultati in base all'ora UTC.
zeckdude,

2
Questa funzione ha fallito 0 di 14603 test tra il 1980 e il 2020.
LSerni,

128

Converti le tue date in unix timestamp, quindi sottrai l'una dall'altra. Questo ti darà la differenza in secondi, che dividi per 86400 (quantità di secondi in un giorno) per darti un numero approssimativo di giorni in quell'intervallo.

Se le date in formato 25.1.2010, 01/25/2010o 2010-01-25, è possibile utilizzare la strtotimefunzione di:

$start = strtotime('2010-01-25');
$end = strtotime('2010-02-20');

$days_between = ceil(abs($end - $start) / 86400);

Utilizzando ceilarrotonda il numero di giorni fino al giorno intero successivo. Utilizzare floorinvece se si desidera ottenere la quantità di giorni interi tra quelle due date.

Se le tue date sono già in formato timestamp unix, puoi saltare la conversione e fare semplicemente la $days_betweenparte. Per formati di date più esotici, potrebbe essere necessario eseguire un'analisi personalizzata per farlo correttamente.


9
Che dire dell'ora legale?
toon81,

3
@ toon81 - usiamo i timestamp di Unix per evitare questi problemi! ;)
Alastair,

6
Permettetemi di elaborare: diciamo che stamattina alle 3 del mattino, quasi tutta l'Europa ha spostato indietro l'orologio di un'ora. Ciò significa che oggi ha 3600 secondi in più e che dovrebbe riflettersi nei timestamp di UNIX. Se lo è, ciò significa che oggi conterà per due giorni con il modo sopra indicato per calcolare il numero di giorni. E non sto nemmeno cominciando a saltare i secondi poiché né PHP né UNIX sembrano rendere conto di quelli (che è realmente comprensibile all'IMO). TL; DR: non tutti i giorni durano 86.400 secondi .
toon81,

2
@ toon81 NON ci sono 3600 secondi in più per quella data. Non succede nulla al timestamp di UNIX quando si va da o verso l'ora legale.
Nickdnk,

1
Se non accade nulla al timestamp UNIX, allora sei d'accordo con me: la differenza tra il timestamp UNIX alle 13:00 $daye il timestamp UNIX alle 13:00 $day+1non è sempre di 86400 secondi nei fusi orari che osservano l'ora legale. Potrebbero essere 23 o 25 ore di secondi anziché 24 ore.
toon81,

112

TL; DR non non usare timestamp UNIX. Non usaretime() . Se lo fai, sii preparato se la sua affidabilità del 98,0825% non riesce. Usa DateTime (o Carbon).

La risposta corretta è quella data da Saksham Gupta (anche le altre risposte sono corrette):

$date1 = new DateTime('2010-07-06');
$date2 = new DateTime('2010-07-09');
$days  = $date2->diff($date1)->format('%a');

O proceduralmente come one-liner:

/**
 * Number of days between two dates.
 *
 * @param date $dt1    First date
 * @param date $dt2    Second date
 * @return int
 */
function daysBetween($dt1, $dt2) {
    return date_diff(
        date_create($dt2),  
        date_create($dt1)
    )->format('%a');
}

Con un avvertimento: il '% a' sembra indicare il numero assoluto di giorni. Se lo si desidera come numero intero con segno, ovvero negativo quando la seconda data è precedente alla prima, è necessario utilizzare il prefisso '% r' (ovvero format('%r%a')).


Se è necessario utilizzare i timestamp UNIX, impostare il fuso orario su GMT per evitare la maggior parte delle insidie ​​descritte di seguito.


Risposta lunga: perché dividere per 24 * 60 * 60 (aka 86400) non è sicuro

La maggior parte delle risposte utilizzando i timestamp UNIX (e 86400 per convertirlo in giorni) fanno due ipotesi che, messe insieme, possono portare a scenari con risultati sbagliati e bug sottili che possono essere difficili da tracciare e sorgere anche giorni, settimane o mesi dopo una distribuzione di successo. Non è che la soluzione non funzioni: funziona. Oggi. Ma potrebbe smettere di funzionare domani.

Il primo errore non è quello di considerare che, alla domanda "Quanti giorni sono passati da ieri?", Un computer potrebbe effettivamente rispondere a zero se tra il presente e l'istante indicato da "ieri" è trascorso meno di un giorno intero .

Di solito quando si converte un "giorno" in un timestamp UNIX, ciò che si ottiene è il timestamp per la mezzanotte di quel particolare giorno.

Quindi tra la mezzanotte del 1 ottobre e il 15 ottobre sono trascorsi quindici giorni. Ma tra le 13:00 del 1 ° ottobre e le 14:55 del 15 ottobre, sono trascorsi quindici giorni meno 5 minuti e la maggior parte delle soluzioni che utilizzano floor()o eseguono la conversione di numero intero implicita segnalerà un giorno in meno del previsto .

Quindi, "quanti giorni fa era Ymd H: i: s"? produrrà la risposta sbagliata .

Il secondo errore equivale a un giorno a 86400 secondi. Questo è quasi sempre vero: capita spesso abbastanza da trascurare le volte che non lo è. Ma la distanza in secondi tra due notti di mezzanotte consecutive non è sicuramente 86400 almeno due volte l'anno quando entra in gioco l'ora legale. Il confronto tra due date oltre un limite DST produrrà la risposta sbagliata.

Quindi, anche se usi "l'hack" per forzare tutti i timestamp di data a un'ora fissa, dì mezzanotte (questo è anche implicitamente fatto da varie lingue e framework quando specifichi solo giorno-mese-anno e non anche ora-minuto-secondo; lo stesso accade con il tipo DATE in database come MySQL), la formula ampiamente utilizzata

 (unix_timestamp(DATE2) - unix_timestamp(DATE1)) / 86400

o

 floor(time() - strtotime($somedate)) / 86400

restituirà, diciamo, 17 quando DATE1 e DATE2 si trovano nello stesso segmento DST dell'anno; ma potrebbe restituire 17.042, e peggio ancora, 16.958. L'uso di floor () o di qualsiasi troncamento implicito in numero intero convertirà quindi quello che avrebbe dovuto essere un 17 in un 16. In altre circostanze, espressioni come "$ giorni> 17" restituiranno true17.042 anche se ciò indica che il giorno trascorso conta ha 18 anni.

E le cose diventano ancora più brutte dal momento che tale codice non è portatile su tutte le piattaforme, perché alcuni di essi potrebbero applicare secondi saltanti e altri no . Su quelle piattaforme che lo fanno , la differenza tra due date non sarà 86400 ma 86401, o forse 86399. Quindi il codice che ha funzionato a maggio e in realtà ha superato tutti i test si interromperà il prossimo giugno quando 12.99999 giorni sono considerati 12 giorni anziché 13. Due date che ha funzionato nel 2015 non funzionerà nel 2017, le stesse date e nessuno dei due è un anno bisestile. Ma tra il 01-03-2018 e il 01-01-2017, su quelle piattaforme che interessano, saranno trascorsi 366 giorni anziché 365, rendendo il 2018 un anno bisestile (che non lo è).

Quindi, se vuoi davvero usare i timestamp UNIX:

  • usa la round()funzione saggiamente, no floor().

  • in alternativa, non calcolare le differenze tra D1-M1-YYY1 e D2-M2-YYY2. Tali date saranno considerate come D1-M1-YYY1 00:00:00 e D2-M2-YYY2 00:00:00. Piuttosto, converti tra D1-M1-YYY1 22:30:00 e D2-M2-YYY2 04:30:00. Avrai sempre un resto di circa venti ore. Questo può diventare ventuno o diciannove, e forse diciotto ore, cinquantanove minuti trentasei secondi. Non importa. È un ampio margine che rimarrà lì e rimarrà positivo per il prossimo futuro. Ora puoi troncarlo floor()in sicurezza.

La soluzione corretta però, per evitare costanti magiche, arrotondare i kludges e un debito di mantenimento, è farlo

  • utilizzare una libreria temporale (Datetime, Carbon, qualunque cosa); non rotolare il tuo

  • scrivere casi di test completi usando scelte di date davvero malvagie - oltre i confini dell'ora legale, attraverso gli anni bisestili, i secondi bisestili e così via, così come le date ordinarie. Idealmente (le chiamate al datetime sono veloci !) Generano quattro interi anni (e un giorno) di date assemblandole da stringhe, in sequenza, e assicurano che la differenza tra il primo giorno e il giorno in esame aumenti costantemente di una. Questo assicurerà che se qualcosa cambia nelle routine di basso livello e correzioni dei secondi bisestili, provi a creare scompiglio, almeno lo saprai .

  • eseguire questi test regolarmente insieme al resto della suite di test. Sono una questione di millisecondi e possono farti letteralmente ore di grattarti la testa.


Qualunque sia la tua soluzione, provala!

La funzione funcdiffseguente implementa una delle soluzioni (come accade, quella accettata) in uno scenario del mondo reale.

<?php
$tz         = 'Europe/Rome';
$yearFrom   = 1980;
$yearTo     = 2020;
$verbose    = false;

function funcdiff($date2, $date1) {
    $now        = strtotime($date2);
    $your_date  = strtotime($date1);
    $datediff   = $now - $your_date;
    return floor($datediff / (60 * 60 * 24));
}
########################################

date_default_timezone_set($tz);
$failures   = 0;
$tests      = 0;

$dom = array ( 0, 31, 28, 31, 30,
                  31, 30, 31, 31,
                  30, 31, 30, 31 );
(array_sum($dom) === 365) || die("Thirty days hath September...");
$last   = array();
for ($year = $yearFrom; $year < $yearTo; $year++) {
    $dom[2] = 28;
    // Apply leap year rules.
    if ($year % 4 === 0)   { $dom[2] = 29; }
    if ($year % 100 === 0) { $dom[2] = 28; }
    if ($year % 400 === 0) { $dom[2] = 29; }
    for ($month = 1; $month <= 12; $month ++) {
        for ($day = 1; $day <= $dom[$month]; $day++) {
            $date = sprintf("%04d-%02d-%02d", $year, $month, $day);
            if (count($last) === 7) {
                $tests ++;
                $diff = funcdiff($date, $test = array_shift($last));
                if ((double)$diff !== (double)7) {
                    $failures ++;
                    if ($verbose) {
                        print "There seem to be {$diff} days between {$date} and {$test}\n";
                    }
                }
            }
            $last[] = $date;
        }
    }
}

print "This function failed {$failures} of its {$tests} tests between {$yearFrom} and {$yearTo}.\n";

Il risultato è

This function failed 280 of its 14603 tests

Horror Story: il costo del "risparmio di tempo"

Questo in realtà è successo alcuni mesi fa. Un ingegnoso programmatore ha deciso di salvare diversi microsecondi da un calcolo che impiegava al massimo una trentina di secondi, inserendo il famigerato codice "(MidnightOfDateB-MidnightOfDateA) / 86400" in diversi punti. È stata un'ottimizzazione così ovvia che non l'ha nemmeno documentata, e l'ottimizzazione ha superato i test di integrazione e si è nascosta nel codice per diversi mesi, il tutto inosservato.

Ciò è accaduto in un programma che calcola i salari di molti venditori più venduti, il più dei quali ha un impatto molto più spaventoso di un intero modesto team di programmatori composto da cinque persone. Un giorno, alcuni mesi fa, per motivi che contano poco, il bug ha colpito - e alcuni di questi ragazzi sono stati scambiati per un'intera giornata di commissioni grasse. Sono stati sicuramente non divertito.

Infinitamente peggio, persero la (già pochissima) fiducia che avevano nel programma non essendo progettato per aggirarli surrettiziamente, e fingevano - e ottenevano - una revisione completa e dettagliata del codice con casi di test eseguiti e commentati nei termini del profano (oltre a molto del trattamento del tappeto rosso nelle settimane successive).

Cosa posso dire: sul lato positivo, ci siamo sbarazzati di molti debiti tecnici e siamo stati in grado di riscrivere e riformattare diversi pezzi di un pasticcio di spaghetti che è stato ricondotto a un'infestazione di COBOL negli anni '90. Il programma ora funziona senza dubbio meglio, e ci sono molte più informazioni di debug per azzerare rapidamente quando qualcosa sembra sospetto. Stimo che solo quest'ultima cosa salverà forse uno o due giorni-uomo al mese per il prossimo futuro.

Sul lato negativo, l'intero brouhaha è costato alla compagnia circa € 200.000 in anticipo - più la faccia, oltre indubbiamente un po 'di potere contrattuale (e, quindi, ancora più soldi).

Il ragazzo responsabile dell '"ottimizzazione" aveva cambiato lavoro un anno fa, prima del disastro, ma si parlava ancora di denunciarlo per danni. E non è andata bene con le alte sfere che è stata "la colpa dell'ultimo ragazzo" - ci è sembrato un set-up per farci ripulire dalla faccenda, e alla fine, siamo ancora nella cuccia e uno del team sta pianificando di smettere.

Novantanove volte su cento, l '"hack 86400" funzionerà alla perfezione. (Ad esempio in PHP, strtotime()ignorerà l'ora legale e segnalerà che tra la mezzanotte dell'ultimo sabato di ottobre e quella del lunedì successivo, sono trascorsi esattamente 2 * 24 * 60 * 60 secondi, anche se chiaramente non è vero ... e due errori faranno felicemente uno giusto).

Questo, onorevoli colleghi, è stato un esempio quando non è stato così. Come per gli airbag e le cinture di sicurezza, forse non avrai mai davvero bisogno della complessità (e della facilità d'uso) di DateTimeo Carbon. Ma il giorno in cui potresti (o il giorno in cui dovrai dimostrare di aver pensato a questo) verrà come un ladro nella notte. Essere preparato.


7
Quando ho visto queste risposte ho pensato di essere stupido e pazzo perché uso sempre DateTime, ma mi hai fatto capire che usare DateTime è il modo giusto. Grazie
Syncro

Ehi, tutti qui, su SO, sono arrivati ​​qui cercando su google days between two days in phpo simili, solo perché la vita è troppo breve per scrivere tutto da soli.
Denis Matafonov,

1
spiegazione dettagliata. + 1
Anant Singh --- Alive to Die

1
A volte vorrei che potessimo preferire le risposte invece della domanda.
Clément Baconnier,

questa deve essere la risposta accettata.
Franz

16

Facile da usare date_diff

$from=date_create(date('Y-m-d'));
$to=date_create("2013-03-15");
$diff=date_diff($to,$from);
print_r($diff);
echo $diff->format('%R%a days');

Questo è un buon modo procedurale per farlo usando la classe DateTime. Manca solo un uso chiaro dell'oggetto intervallo ( $diffvariabile in questo caso). Qualcosa del genere if ($diff->days > 30) { [doyourstuff]; }
Gusstavv Gil,

16

Stile orientato agli oggetti:

$datetime1 = new DateTime('2009-10-11');
$datetime2 = new DateTime('2009-10-13');
$interval = $datetime1->diff($datetime2);
echo $interval->format('%R%a days');

Stile procedurale:

$datetime1 = date_create('2009-10-11');
$datetime2 = date_create('2009-10-13');
$interval = date_diff($datetime1, $datetime2);
echo $interval->format('%R%a days');

11

Usato questo :)

$days = (strtotime($endDate) - strtotime($startDate)) / (60 * 60 * 24);
print $days;

Ora funziona


14
Commento molto vecchio sopra, ma non è corretto. StackOverflow non consentono di rispondere alla tua domanda (anche quando si chiede la tua domanda). Rispondere alla domanda da soli dopo che qualcuno ha già pubblicato la stessa soluzione è comunque considerato scortese.
Maarten Bodewes,

Questa funzione fallì 560 dei suoi 14603 test tra il 1980 e il 2020.
LSerni,

10

Bene, la risposta selezionata non è la più corretta perché fallirà al di fuori di UTC. A seconda del fuso orario ( elenco ) potrebbero esserci degli aggiustamenti del tempo che creano giorni "senza" 24 ore, e questo farà fallire il calcolo (60 * 60 * 24).

Eccone un esempio:

date_default_timezone_set('europe/lisbon');
$time1 = strtotime('2016-03-27');
$time2 = strtotime('2016-03-29');
echo floor( ($time2-$time1) /(60*60*24));
 ^-- the output will be **1**

Quindi la soluzione corretta utilizzerà DateTime

date_default_timezone_set('europe/lisbon');
$date1 = new DateTime("2016-03-27");
$date2 = new DateTime("2016-03-29");

echo $date2->diff($date1)->format("%a");
 ^-- the output will be **2**

7

Calcola la differenza tra due date:

$date1=date_create("2013-03-15");
$date2=date_create("2013-12-12");

$diff=date_diff($date1,$date2);

echo $diff->format("%R%a days");

Uscita: +272 giorni

La funzione date_diff () restituisce la differenza tra due oggetti DateTime.


6
$start = '2013-09-08';
$end = '2013-09-15';
$diff = (strtotime($end)- strtotime($start))/24/3600; 
echo $diff;

Questa funzione fallì 560 dei suoi 14603 test tra il 1980 e il 2020.
LSerni

6

Sto usando Carbon nei miei progetti di compositore per questo e scopi simili.

Sarebbe facile come questo:

$dt = Carbon::parse('2010-01-01');
echo $dt->diffInDays(Carbon::now());

5

Puoi trovare le date semplicemente per

<?php
$start  = date_create('1988-08-10');
$end    = date_create(); // Current time and date
$diff   = date_diff( $start, $end );

echo 'The difference is ';
echo  $diff->y . ' years, ';
echo  $diff->m . ' months, ';
echo  $diff->d . ' days, ';
echo  $diff->h . ' hours, ';
echo  $diff->i . ' minutes, ';
echo  $diff->s . ' seconds';
// Output: The difference is 28 years, 5 months, 19 days, 20 hours, 34 minutes, 36 seconds

echo 'The difference in days : ' . $diff->days;
// Output: The difference in days : 10398

4
$datediff = floor(strtotime($date1)/(60*60*24)) - floor(strtotime($date2)/(60*60*24));

e, se necessario:

$datediff=abs($datediff);

3

Se hai i tempi in secondi (IE unix time stamp), puoi semplicemente sottrarre i tempi e dividerli per 86400 (secondi al giorno)


3

numero di giorni tra due date in PHP

      function dateDiff($date1, $date2)  //days find function
        { 
            $diff = strtotime($date2) - strtotime($date1); 
            return abs(round($diff / 86400)); 
        } 
       //start day
       $date1 = "11-10-2018";        
       // end day
       $date2 = "31-10-2018";    
       // call the days find fun store to variable 
       $dateDiff = dateDiff($date1, $date2); 

       echo "Difference between two dates: ". $dateDiff . " Days "; 

1
Fantastico ha funzionato come un fascino, puoi dirmi a cosa serve 86400 num?
Parth Shah,

Il numero 86400 viene utilizzato per 1 giorno = 24 ore e 24 * 60 * 60 = 86400 secondi in un giorno
mallikarjun SK

3

Puoi provare il codice qui sotto:

$dt1 = strtotime("2019-12-12"); //Enter your first date
$dt2 = strtotime("12-12-2020"); //Enter your second date
echo abs(($dt1 - $dt2) / (60 * 60 * 24));

2
Con le domande più vecchie che hanno risposte esistenti è utile spiegare quale nuovo aspetto porta la tua risposta alla domanda. Se pertinente, è anche utile riconoscere eventuali cambiamenti che potrebbero essersi verificati da quando è stata posta la domanda.
Jason Aller,

2
function howManyDays($startDate,$endDate) {

    $date1  = strtotime($startDate." 0:00:00");
    $date2  = strtotime($endDate." 23:59:59");
    $res    =  (int)(($date2-$date1)/86400);        

return $res;
} 

Questa funzione fallì 320 dei suoi 14603 test tra il 1980 e il 2020.
LSerni

2

Se vuoi fare eco tutti i giorni tra la data di inizio e di fine, ho pensato a questo:

$startdatum = $_POST['start']; // starting date
$einddatum = $_POST['eind']; // end date

$now = strtotime($startdatum);
$your_date = strtotime($einddatum);
$datediff = $your_date - $now;
$number = floor($datediff/(60*60*24));

for($i=0;$i <= $number; $i++)
{
    echo date('d-m-Y' ,strtotime("+".$i." day"))."<br>";
}

2

Il modo più semplice per trovare la differenza di giorni tra due date

$date1 = strtotime("2019-05-25"); 
$date2 = strtotime("2010-06-23");

$date_difference = $date2 - $date1;

$result =  round( $date_difference / (60 * 60 * 24) );

echo $result;

1
    // Change this to the day in the future
$day = 15;

// Change this to the month in the future
$month = 11;

// Change this to the year in the future
$year = 2012;

// $days is the number of days between now and the date in the future
$days = (int)((mktime (0,0,0,$month,$day,$year) - time(void))/86400);

echo "There are $days days until $day/$month/$year";

1

Ecco la mia versione migliorata che mostra 1 anno / i 2 mese / i 25 giorno / i se viene passato il 2o parametro.

class App_Sandbox_String_Util {
    /**
     * Usage: App_Sandbox_String_Util::getDateDiff();
     * @param int $your_date timestamp
     * @param bool $hr human readable. e.g. 1 year(s) 2 day(s)
     * @see http://stackoverflow.com/questions/2040560/finding-the-number-of-days-between-two-dates
     * @see http://qSandbox.com
     */
    static public function getDateDiff($your_date, $hr = 0) {
        $now = time(); // or your date as well
        $datediff = $now - $your_date;
        $days = floor( $datediff / ( 3600 * 24 ) );

        $label = '';

        if ($hr) {
            if ($days >= 365) { // over a year
                $years = floor($days / 365);
                $label .= $years . ' Year(s)';
                $days -= 365 * $years;
            }

            if ($days) {
                $months = floor( $days / 30 );
                $label .= ' ' . $months . ' Month(s)';
                $days -= 30 * $months;
            }

            if ($days) {
                $label .= ' ' . $days . ' day(s)';
            }
        } else {
            $label = $days;
        }

        return $label;
    }
}

1
$early_start_date = date2sql($_POST['early_leave_date']);


$date = new DateTime($early_start_date);
$date->modify('+1 day');


$date_a = new DateTime($early_start_date . ' ' . $_POST['start_hr'] . ':' . $_POST['start_mm']);
$date_b = new DateTime($date->format('Y-m-d') . ' ' . $_POST['end_hr'] . ':' . $_POST['end_mm']);

$interval = date_diff($date_a, $date_b);


$time = $interval->format('%h:%i');
$parsed = date_parse($time);
$seconds = $parsed['hour'] * 3600 + $parsed['minute'] * 60;
//        display_error($seconds);

$second3 = $employee_information['shift'] * 60 * 60;

if ($second3 < $seconds)
    display_error(_('Leave time can not be greater than shift time.Please try again........'));
    set_focus('start_hr');
    set_focus('end_hr');
    return FALSE;
}

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

usato il codice sopra molto semplice. Grazie.


1
function get_daydiff($end_date,$today)
{
    if($today=='')
    {
        $today=date('Y-m-d');
    }
    $str = floor(strtotime($end_date)/(60*60*24)) - floor(strtotime($today)/(60*60*24));
    return $str;
}
$d1 = "2018-12-31";
$d2 = "2018-06-06";
echo get_daydiff($d1, $d2);

1

Usando questa semplice funzione. Dichiara funzione

<?php
function dateDiff($firstDate,$secondDate){
    $firstDate = strtotime($firstDate);
    $secondDate = strtotime($secondDate);

    $datediff = $firstDate - $secondDate;
    $output = round($datediff / (60 * 60 * 24));
    return $output;
}
?>

e chiama questa funzione in questo modo dove vuoi

<?php
    echo dateDiff("2018-01-01","2018-12-31");    

// OR

    $firstDate = "2018-01-01";
    $secondDate = "2018-01-01";
    echo dateDiff($firstDate,$secondDate);    
?>

1
$diff = strtotime('2019-11-25') - strtotime('2019-11-10');
echo abs(round($diff / 86400));

2
Benvenuti in SO! Quando rispondi a un post con solo codice, spiegalo un po '. Il codice che porti è calcolato tra il 10-11-2019 e il 25-11-2019. Quindi non risponde alla domanda. Ecco perché è bene spiegare il tuo POV meglio che ottenere il downgrade.
David García Bodego,

0

Se stai usando MySql

function daysSince($date, $date2){
$q = "SELECT DATEDIFF('$date','$date2') AS days;";
$result = execQ($q);
$row = mysql_fetch_array($result,MYSQL_BOTH);
return ($row[0]);

}

function execQ($q){
$result = mysql_query( $q);
if(!$result){echo ('Database error execQ' . mysql_error());echo $q;}    
return $result;

}


0

Prova a usare Carbon

$d1 = \Carbon\Carbon::now()->subDays(92);
$d2 = \Carbon\Carbon::now()->subDays(10);
$days_btw = $d1->diffInDays($d2);

Inoltre puoi usare

\Carbon\Carbon::parse('')

per creare un oggetto della data Carbon utilizzando la stringa data / ora specificata.


Puoi dirmi qual è la differenza tra questa e la mia risposta?
Arda,

1
Per fare una semplice differenza di data, suggerisci di includere un pacchetto completamente nuovo?
tomazahlin

0

Guardando tutte le risposte compongo la funzione universale di ciò che funziona su tutte le versioni di PHP.

if(!function_exists('date_between')) :
    function date_between($date_start, $date_end)
    {
        if(!$date_start || !$date_end) return 0;

        if( class_exists('DateTime') )
        {
            $date_start = new DateTime( $date_start );
            $date_end   = new DateTime( $date_end );
            return $date_end->diff($date_start)->format('%a');
        }
        else
        {           
            return abs( round( ( strtotime($date_start) - strtotime($date_end) ) / 86400 ) );
        }
    }
endif;

In generale, utilizzo "DateTime" per trovare giorni tra 2 date. Ma se per qualche motivo, in alcune impostazioni del server non è abilitato 'DateTime', utilizzerà un calcolo semplice (ma non sicuro) con 'strtotime ()'.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.