semana - Cálculo de fecha PHP
strtotime php ejemplos (11)
Cuál es el mejor (forma independiente de formato de fecha) en PHP para calcular la diferencia en días entre dos fechas en formato especificado.
Intenté la siguiente función:
function get_date_offset($start_date, $end_date)
{
$start_time = strtotime($start_date);
$end_time = strtotime($end_date);
return round(($end_time-$start_time)/(3600*24));
}
Funciona bien en Linux Box, pero cuando se ejecuta bajo Windows strtotime devuelve ''''.
EDITAR :
La fecha de entrada está en formato mm / dd / aaaa , pero me gustaría hacer que acepte $ formato como parámetro.
Solo necesito diferencia en días.
El problema con PHP es que no tiene un tipo definido de DateTime. Puede usar una marca de tiempo Unix o la clase DateTime incorporada, pero su funcionalidad es bastante limitada. Espero que haya algunas clases de terceros con un soporte más amplio para los cálculos de fecha y hora, pero no lo he buscado.
El uso de marcas de tiempo de Unix para los cálculos de fecha (no del tiempo) también es complicado. Tendría que descartar la parte de tiempo, pero simplemente restablecer a 00:00 no es seguro debido al horario de verano (DST). El horario de verano tiene el efecto de que hay dos días al año que no tienen exactamente 24 horas. Por lo tanto, al agregar / restar fechas, puede terminar con un valor que no se divide de manera uniforme con 3600 * 24.
Sugiero que busque una clase de terceros que tenga el soporte adecuado para todas estas cosas. Los cálculos de fecha / hora son increíbles en su fealdad. :PAG
La clase PEAR Date ofrece todo tipo de características para encontrar las diferencias entre las fechas y aproximadamente otras 1000 cosas también. Los documentos para ello están aquí ...
No estoy seguro de qué se considera mejor , ya que no hay una función incorporada en PHP para hacer esto, pero algunas personas han usado gregoriantojd () , por ejemplo en esta publicación del foro .
No sobre-diseñar, muchachos.
$d1 = strtotime($first_date);
$d2 = strtotime($second_date);
$delta = $d2 - $d1;
$num_days = ($delta / 86400);
Si no quiere o no puede usar el Zend Framework o el paquete Pear pruebe esta función, espero que esto ayude:
function dateDifference($date1, $date2)
{
$d1 = (is_string($date1) ? strtotime($date1) : $date1);
$d2 = (is_string($date2) ? strtotime($date2) : $date2);
$diff_secs = abs($d1 - $d2);
$base_year = min(date("Y", $d1), date("Y", $d2));
$diff = mktime(0, 0, $diff_secs, 1, 1, $base_year);
return array
(
"years" => abs(substr(date(''Ymd'', $d1) - date(''Ymd'', $d2), 0, -4)),
"months_total" => (date("Y", $diff) - $base_year) * 12 + date("n", $diff) - 1,
"months" => date("n", $diff) - 1,
"days_total" => floor($diff_secs / (3600 * 24)),
"days" => date("j", $diff) - 1,
"hours_total" => floor($diff_secs / 3600),
"hours" => date("G", $diff),
"minutes_total" => floor($diff_secs / 60),
"minutes" => (int) date("i", $diff),
"seconds_total" => $diff_secs,
"seconds" => (int) date("s", $diff)
);
}
Zend Framework tiene la clase Zend_Date para tratar con "fecha matemática". Funciona alrededor de los límites de marca de tiempo específicos del sistema mediante el uso de la extensión BCMath, o si eso no está disponible limita las marcas de tiempo por el valor máximo de flotación para su sistema.
// example printing difference in days
require(''Zend/Date.php'');
$date1 = new Zend_Date();
$date1->set(2, Zend_Date::MONTH);
$date1->set(27, Zend_Date::DAY);
$date1->set(2008, Zend_Date::YEAR);
$date2 = new Zend_Date();
$date2->set(3, Zend_Date::MONTH);
$date2->set(3, Zend_Date::DAY);
$date2->set(2008, Zend_Date::YEAR);
echo ($date2->getTimestamp() - $date1->getTimestamp()) / (3600*24);
gregoriantojd () da los mismos resultados que usando strtotime (), mira este blogpost para saber cómo hacerlo:
El siguiente funciona para mi. Creo que lo encontré en los documentos de php.net en algún lugar.
* Editar - Woops, no vio la publicación de csl. Esta es la función exacta de su enlace, debe haber sido donde lo encontré. ;)
//Find the difference between two dates
function dateDiff($startDate, $endDate)
{
// Parse dates for conversion
$startArry = date_parse($startDate);
$endArry = date_parse($endDate);
// Convert dates to Julian Days
$start_date = gregoriantojd($startArry["month"], $startArry["day"], $startArry["year"]);
$end_date = gregoriantojd($endArry["month"], $endArry["day"], $endArry["year"]);
// Return difference
return round(($end_date - $start_date), 0);
}
Estaba tratando de calcular la diferencia de dos fechas con el propósito de mostrar la duración de un evento. La mayoría de las funciones dadas en el problema falla si el evento tiene una duración desde viernes a las 17:00 hasta el domingo a las 15:00. Mi objetivo era encontrar la diferencia entre las fechas como:
date(''Ymd'',$end)-date(''Tmd'',$begining);
Pero es probable que falle porque no hay 99 meses en un año y 99 días en un mes. Podría convertir la cadena de fecha a la marca de tiempo de UNIX y dividir entre 60 * 60 * 12, pero algunos días tienen un número mayor o menor de horas, a veces hay un próximo salto. Así que hice mi propia función usando getdate () una función que devuelve una matriz de información sobre la marca de tiempo.
/*
* datediff($first,$last)
* $first - unix timestamp or string aksepted by strtotime()
* $last - unix timestamp or string aksepted by strtotime()
*
* return - the difference in days betveen the two dates
*/
function datediff($first,$last){
$first = is_numeric($first) ? $first : strtotime($first);
$last = is_numeric($last ) ? $last : strtotime($last );
if ($last<$first){
// Can''t calculate negative difference in dates
return -1;
}
$first = getdate($first);
$last = getdate($last );
// find the difference in days since the start of the year
$datediff = $last[''yday''] - $first[''yday''];
// if the years do not match add the appropriate number of days.
$yearCountedFrom = $first[''year''];
while($last[''year''] != $yearCountedFrom ){
// Take leap years into account
if( $yearCountedFrom % 4 == 0 && $yearCountedFrom != 1900 && $yearCountedFrom != 2100 ){
//leap year
$datediff += 366;
}else{
$datediff += 365;
}
$yearCountedFrom++;
}
return $datediff;
}
Con respecto a la función GregorianToJD (), podría funcionar, pero me siento un poco incómodo ya que no entiendo cómo funciona.
Calcule la diferencia entre dos Fechas (y tiempo) usando Php. La siguiente página proporciona una variedad de métodos diferentes (7 en total) para realizar cálculos de fecha / hora usando Php, para determinar la diferencia en el tiempo (horas, munites), días, meses o años entre dos fechas.
Ver hora de fecha PHP - 7 métodos para calcular la diferencia entre 2 fechas
PHP 5.2 introduce las clases DateTime y DateInterval que lo hace fácil:
function get_date_offset($start_date, $end_date)
{
$start_time = new DateTime($start_date);
$end_time = new DateTime($end_date);
$interval = $end_time->diff($start_time);
return $interval->format(''%a days'');
}