Pregunta

Estoy tratando de calcular la cantidad de días entre dos días, pero tengo problemas con el horario de verano. Aquí está mi código:

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

Funciona bien siempre que los días se encuentren dentro del mismo período de horario de verano:

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

Pero no si están más separados:

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

Quiero un número par de días y no me importa el horario de verano. Supongo que podría redondear el resultado, pero eso se siente torpe. ¿Hay una manera mejor (fácil)? No quiero tener que escribir todo un día para analizar y contar los años bisiestos si puedo evitarlo.

(Nota: esto tiene que ejecutarse en php 5.1.6, por lo que algunas de las funciones de fecha en 5.3 pueden no estar disponibles).

Un poco más de información: voy a tomar el desplazamiento y agregarlo a otras fechas y horas que están en una base de datos, y quiero que solo cambie la parte del día, no la parte del tiempo. Resulta que el redondeo no funcionará, de todos modos, porque cuando hago la adición, se detiene una hora en la otra dirección. Tal vez hay un mejor enfoque para todo el problema ...

¿Fue útil?

Solución

puede usar http://ca3.php.net/date_default_timezone_set para configurar la zona horaria en GMT para que no haya compensación.

Alternativamente, puede agregar manualmente un desplazamiento utilizando el date('I',$timetamp)

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

Otros consejos

Forzar las fechas para vivir en una zona horaria sin horario de verano, 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

Puede forzar el redondeo en una dirección específica utilizando floor() o ceil() .

Probé el código 'UTC' anterior. No funcionó para mí. Todavía tengo valores decimales.

Cuando hay una fecha de ahorro de luz diurna dentro del rango de fechas, la parte decimal en serie de diferencia será inferior a .5 o superior. cuando el intervalo de fechas tiene un ahorro de luz diurno el 15/3, el valor decimal es > .5 cuando se va la luz del día fecha decimal & Lt; .5. así que solo pongo la diferencia serial en una función round () y obtengo los números enteros que necesito por número de días.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top