Domanda

Sto cercando di calcolare il numero di giorni tra due giorni, ma sto riscontrando problemi con l'ora legale. Ecco il mio codice:

function date_diff($old_date, $new_date) {
    $offset = strtotime($new_date) - strtotime($old_date);
    return $offset/60/60/24;
}

Funziona bene fintanto che i giorni sono entrambi nello stesso periodo di ora legale:

echo date_diff('3/15/09', '3/18/09'); // 3

Ma non se sono più distanti:

echo date_diff('11/15/08', '3/18/09'); // 122.95833333333

Voglio un numero pari di giorni e non mi interessa l'ora legale. Suppongo che potrei arrotondare il risultato, ma mi sembra fastidioso. Esiste un modo migliore (facile)? Non voglio scrivere un'intera giornata analizzando e contando, evitando gli anni bisestili, se posso evitarlo.

(Nota: questo deve essere eseguito in php 5.1.6, quindi alcune delle funzionalità di data in 5.3 potrebbero non essere disponibili.)

Altre informazioni: prenderò l'offset e lo aggiungerò ad altri periodi di dati che sono in un db, e voglio cambiare solo la parte del giorno, non la parte del tempo. Risulta che l'arrotondamento non funzionerà, comunque, perché quando faccio l'aggiunta scatta di un'ora nell'altra direzione. Forse c'è un approccio migliore all'intero problema ....

È stato utile?

Soluzione

potresti usare http://ca3.php.net/date_default_timezone_set per impostare il fuso orario su GMT quindi non ci sarà alcun offset.

In alternativa, puoi aggiungere manualmente un offset usando date('I',$timetamp)

if ( date("I") == 1 ) {      // "WE ARE MDT";  
        $timeZone = "MDT";  
} else {  
        $timeZone = "MST";  
}  

Altri suggerimenti

Forza le date a vivere in un fuso orario senza ora legale, GMT / UTC:

function date_diff($old_date, $new_date) {
  $offset = strtotime($new_date . " UTC") - strtotime($old_date . " UTC");
  return $offset/60/60/24;
}

echo date_diff('3/15/09', '3/18/09'); // 3
echo date_diff('11/15/08', '3/18/09'); // 123

Puoi forzare l'arrotondamento in una direzione specifica usando floor() o ceil() .

Ho provato il codice "UTC" sopra. Non ha funzionato per me. Ho ottenuto valori decimali.

Quando vi è una data di ora legale all'interno dell'intervallo di date, la parte decimale seriale della differenza sarà inferiore a 0,5 o superiore. quando l'intervallo di date ha l'ora legale attiva 3/15 il valore decimale è > .5 quando la luce del giorno si spegne decimale & Lt; .5. quindi inserisco semplicemente la differenza seriale in una funzione round () e ottengo i numeri interi necessari per il numero di giorni.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top