2012-01-03 13 views
6

Ho cercato per sempre questo, ma la risposta sembra in nessun posto. Ecco il problema:PHP, vedere se l'intervallo di date è in parte all'interno di un altro intervallo di date

Dire, ho due intervalli di date.

$daterange1 = 2012-04-20 till 2012-04-28 
$daterange2 = 2012-04-18 till 2012-05-01 

Ora, mi piacerebbe sapere se daterange2 si trova all'interno di daterange1. Ma, come puoi vedere, daterange2 solo parzialmente è all'interno di daterange1. C'è un modo di ottenere 3 variabili di nuovo, qualcosa di simile a:

  1. 2012-04-18 fino 2012-04-20
  2. 2012-04-20 fino 2012-04-28
  3. 2012-04 -28 fino al 2012-05-01

So che sembra un po 'vago, ma davvero non so come spiegarlo in modo diverso.

+3

Capisco la domanda, potresti voler convertire tutte le volte con la funzione 'strtotime()' e iniziare a confrontare. Forse un oggetto DateTime ti aiuterà anche qui. –

+0

devi sapere se l'intervallo è all'interno e la terza variabile –

risposta

5

Bene, logicamente puoi abbattere i requisiti per un intervallo di essere parzialmente in un altro.

Una gamma è solo in parte all'interno di un altro campo di se:

  • di range1 data di inizio è> alla data di inizio del range2 ma non> dalla data finale del range2
  • di range1 data di fine è < dalla data finale del range2 ma non < della data di inizio del range2

Se uno o entrambi sono vere, gli intervalli si trovano uno nell'altro.

7

Ecco un esempio utilizzando la classe DateTime di PHP. Nota che se passi una stringa di data non valida a DateTime::__construct() la funzione genererà un'eccezione, quindi dovresti implementare un blocco try/catch se sei preoccupato per questo. Inoltre, utilizzo le funzioni di PHP min e max in modo che non importi l'ordine in cui sono specificate le date.

$daterange1 = array('2012-04-20', '2012-04-28'); 
$daterange2 = array('2012-04-18', '2012-05-01'); 

$range_min = new DateTime(min($daterange1)); 
$range_max = new DateTime(max($daterange1)); 

$start = new DateTime(min($daterange2)); 
$end = new DateTime(max($daterange2)); 

if ($start >= $range_min && $end <= $range_max) { 
    echo 'woot!'; 
} else { 
    echo 'doh!'; 
} 
0

Anche se questo è un post molto vecchio. Ma ancora se qualcuno si è bloccato. Ecco un esempio completo di date sovrapposte.

<?php 
$daterange1 = array('2017-09-24', '2017-09-28'); 
$daterange2 = array('2017-09-22', '2017-09-25'); 

$range_min = new DateTime(min($daterange1)); 
$range_max = new DateTime(max($daterange1)); 

$start = new DateTime(min($daterange2)); 
$end = new DateTime(max($daterange2)); 

if ($start >= $range_min && $end <= $range_max) { 
echo 'Overlapping!'; 
} 
else if($end > $range_min && $start < $range_max){ 
echo "partialy"; 
} 
else { 
echo 'free!'; 
} 
?> 
Problemi correlati