obtener - hora sistema php
realizar operaciones relacionadas con la fecha y hora en PHP (12)
Recomiendo usar los objetos DateTime de PHP 5.2, en lugar de utilizar las marcas de tiempo de UNIX, cuando se realizan cálculos de fecha. Cuando utiliza las funciones de fecha de PHP que devuelven las marcas de tiempo de UNIX, tiene un rango muy limitado para trabajar (por ejemplo, nada antes de 1970).
¿Cómo se realizan las operaciones de fecha y hora, como agregar fecha, encontrar diferencia, averiguar cuántos días se excluyen los fines de semana en un intervalo? Personalmente, comencé a pasar algunas de estas operaciones a mis postgresql dbms, ya que normalmente solo tendría que emitir una declaración sql para obtener una respuesta, sin embargo, para hacerlo en PHP tendría que escribir mucho más código que significa más oportunidades. para que ocurran errores ...
¿Hay alguna biblioteca en PHP que funcione de manera tal que no requiera mucho código? que supera a sql en una situación en la que ''Dadas dos fechas, ¿cuántos días de trabajo hay entre las dos fechas? ¿Implementar en SQL, o $ pet_lang ''que se resuelve haciendo esta consulta?
SELECT COUNT(*) AS total_days
FROM (SELECT date ''2008-8-26'' + generate_series(0,
(date ''2008-9-1'' - date ''2008-8-26'')) AS all_days) AS calendar
WHERE EXTRACT(isodow FROM all_days) < 6;
@Rushi no me gusta strtotime () personalmente ... no sé por qué pero descubrí esta mañana que pasar una cadena como esta ''2008-09-11 9: 5 AM'' a strtotime me devuelve un falso ...
No creo que el código que proporcionó resuelva el problema de ejemplo ''Dadas dos fechas, ¿cuántos días de trabajo hay entre las dos fechas? Implementar en SQL, o $ pet_lang ''y no tengo en cuenta si tengo una lista de días festivos ...
El método más fácil es usar una marca de tiempo, que representa el número de segundos desde el 1 de enero de 2008. Con un tipo de indicación de fecha y hora, puede hacer cosas como ...
now = time();
tomorrow = now + 24 * 60 * 60; // 24 hours * 60 minutes * 60 seconds
Consulte la documentación de time () , date () y mktime () en las páginas web de php. Esos son los tres métodos que suelo usar con mayor frecuencia.
Mientras que para la mayoría de las operaciones de fecha y hora normalmente convertiría a Unixtime y realizar restas de suma, etc. en el entero Unixtime, es posible que desee consultar la clase Zend_Date de Zend framework.
Esto tiene mucha de la funcionalidad que describes. Aunque Zend es considerado como un "marco", funciona excepcionalmente bien como una biblioteca de clases para elegir y elegir elementos. De forma rutinaria lo incluimos en proyectos y luego simplemente insertamos bits cuando los necesitamos.
PEAR :: Date también parece que podría tener alguna funcionalidad útil: http://pear.php.net/package/Date . PEAR :: Calendar también puede ser útil: http://pear.php.net/package/Calendar
Puede usar una combinación de strtotime , mktime y date todo la aritmética
Aquí hay un ejemplo que usa un combo todo aritmética http://rushi.wordpress.com/2008/04/13/php-print-out-age-of-date-in-words/ Reproduciré el código aquí por simplicidad
if ($timestamp_diff < (60*60*24*7)) {
echo floor($timestamp_diff/60/60/24)." Days";
} elseif ($timestamp_diff > (60*60*24*7*4)) {
echo floor($timestamp_diff/60/60/24/7)." Weeks";
} else {
$total_months = $months = floor($timestamp_diff/60/60/24/30);
if($months >= 12) {
$months = ($total_months % 12);
$years = ($total_months - $months)/12;
echo $years . " Years ";
}
if($months > 0)
echo $months . " Months";
}
?>
strtotime () es útil, pero tiene algunos comportamientos extraños que pueden aparecer ocasionalmente si no solo lo está usando para convertir una cadena de fecha / hora formateada.
cosas como "+1 mes" o "-3 días" a veces no pueden darle lo que espera que salga.
Puede obtener el número de días entre dos fechas como esta:
$days = (strtotime("2008-09-10") - strtotime("2008-09-12")) / (60 * 60 * 24);
Y puedes hacer funcionar algo así (no tengo php instalado en mi computadora de trabajo, así que no puedo garantizar que la sintaxis sea 100% correcta)
function isWorkDay($date)
{
// check if workday and return true if so
}
function numberOfWorkDays($startdate, $enddate)
{
$workdays = 0;
$tmp = strtotime($startdate);
$end = strtotime($enddate);
while($tmp <= $end)
{
if ( isWorkDay( date("Y-m-d",$tmp) ) ) $workdays++;
$tmp += 60*60*24;
}
return $workdays;
}
Si no te gusta Strtotime y siempre tienes la fecha en el mismo formato, puedes usar la función de explosión como
list($year, $month, day) = explode("-", $date);
Para agregar una fecha, puede usar el método DateTime :: add ( Agrega una cantidad de días, meses, años, horas, minutos y segundos a un objeto DateTime ), disponible desde php 5.3.0 en adelante.
Para encontrar la diferencia entre dos fechas, está el método DateTime :: diff ; pero no parece haber un método para contar los días hábiles entre dos fechas.
para obtener días hábiles / feriados, postgresql CTE ftw - vea http://osssmb.wordpress.com/2009/12/02/business-days-working-days-sql-for-postgres-2/
Si echa un vistazo a http://php.net/date , encontrará algunos ejemplos del uso de mktime()
para realizar operaciones.
Un ejemplo simple sería entrenar qué fecha de mañana sería. Puede hacerlo simplemente agregando 1, al valor del día en mktime()
siguiente manera:
$tomorrow = date("Y-m-d", mktime(0, 0, 0, date("m"), date("d") + 1, date("Y")));
Así que aquí, recibirá una fecha en forma de AAAA-MM-DD que contiene la fecha de mañana. También puede restar días simplemente reemplazando ''+'' por ''-''. mktime()
hace que la vida sea mucho más fácil, y le ahorra tener que hacer declaraciones anidadas si y otras codificaciones problemáticas.
El objeto DateTime de PHP5 + es útil porque tiene en cuenta el tiempo bisiesto y el ahorro de luz diurna, pero necesita cierta extensión para resolver realmente el problema. Escribí lo siguiente para resolver un problema similar. El método find_WeekdaysFromThisTo () es fuerza bruta, pero funciona razonablemente rápido si su lapso de tiempo es inferior a 2 años.
$tryme = new Extended_DateTime(''2007-8-26'');
$newer = new Extended_DateTime(''2008-9-1'');
print ''Weekdays From ''.$tryme->format(''Y-m-d'').'' To ''.$newer->format(''Y-m-d'').'': ''.$tryme -> find_WeekdaysFromThisTo($newer) ."/n";
/* Output: Weekdays From 2007-08-26 To 2008-09-01: 265 */
print ''All Days From ''.$tryme->format(''Y-m-d'').'' To ''.$newer->format(''Y-m-d'').'': ''.$tryme -> find_AllDaysFromThisTo($newer) ."/n";
/* Output: All Days From 2007-08-26 To 2008-09-01: 371 */
$timefrom = $tryme->find_TimeFromThisTo($newer);
print ''Between ''.$tryme->format(''Y-m-d'').'' and ''.$newer->format(''Y-m-d'').'' there are ''.
$timefrom[''years''].'' years, ''.$timefrom[''months''].'' months, and ''.$timefrom[''days''].
'' days.''."/n";
/* Output: Between 2007-08-26 and 2008-09-01 there are 1 years, 0 months, and 5 days. */
class Extended_DateTime extends DateTime {
public function find_TimeFromThisTo($newer) {
$timefrom = array(''years''=>0,''months''=>0,''days''=>0);
// Clone because we''re using modify(), which will destroy the object that was passed in by reference
$testnewer = clone $newer;
$timefrom[''years''] = $this->find_YearsFromThisTo($testnewer);
$mod = ''-''.$timefrom[''years''].'' years'';
$testnewer -> modify($mod);
$timefrom[''months''] = $this->find_MonthsFromThisTo($testnewer);
$mod = ''-''.$timefrom[''months''].'' months'';
$testnewer -> modify($mod);
$timefrom[''days''] = $this->find_AllDaysFromThisTo($testnewer);
return $timefrom;
} // end function find_TimeFromThisTo
public function find_YearsFromThisTo($newer) {
/*
If the passed is:
not an object, not of class DateTime or one of its children,
or not larger (after) $this
return false
*/
if (!is_object($newer) || !($newer instanceof DateTime) || $newer->format(''U'') < $this->format(''U''))
return FALSE;
$count = 0;
// Clone because we''re using modify(), which will destroy the object that was passed in by reference
$testnewer = clone $newer;
$testnewer -> modify (''-1 year'');
while ( $this->format(''U'') < $testnewer->format(''U'')) {
$count ++;
$testnewer -> modify (''-1 year'');
}
return $count;
} // end function find_YearsFromThisTo
public function find_MonthsFromThisTo($newer) {
/*
If the passed is:
not an object, not of class DateTime or one of its children,
or not larger (after) $this
return false
*/
if (!is_object($newer) || !($newer instanceof DateTime) || $newer->format(''U'') < $this->format(''U''))
return FALSE;
$count = 0;
// Clone because we''re using modify(), which will destroy the object that was passed in by reference
$testnewer = clone $newer;
$testnewer -> modify (''-1 month'');
while ( $this->format(''U'') < $testnewer->format(''U'')) {
$count ++;
$testnewer -> modify (''-1 month'');
}
return $count;
} // end function find_MonthsFromThisTo
public function find_AllDaysFromThisTo($newer) {
/*
If the passed is:
not an object, not of class DateTime or one of its children,
or not larger (after) $this
return false
*/
if (!is_object($newer) || !($newer instanceof DateTime) || $newer->format(''U'') < $this->format(''U''))
return FALSE;
$count = 0;
// Clone because we''re using modify(), which will destroy the object that was passed in by reference
$testnewer = clone $newer;
$testnewer -> modify (''-1 day'');
while ( $this->format(''U'') < $testnewer->format(''U'')) {
$count ++;
$testnewer -> modify (''-1 day'');
}
return $count;
} // end function find_AllDaysFromThisTo
public function find_WeekdaysFromThisTo($newer) {
/*
If the passed is:
not an object, not of class DateTime or one of its children,
or not larger (after) $this
return false
*/
if (!is_object($newer) || !($newer instanceof DateTime) || $newer->format(''U'') < $this->format(''U''))
return FALSE;
$count = 0;
// Clone because we''re using modify(), which will destroy the object that was passed in by reference
$testnewer = clone $newer;
$testnewer -> modify (''-1 day'');
while ( $this->format(''U'') < $testnewer->format(''U'')) {
// If the calculated day is not Sunday or Saturday, count this day
if ($testnewer->format(''w'') != ''0'' && $testnewer->format(''w'') != ''6'')
$count ++;
$testnewer -> modify (''-1 day'');
}
return $count;
} // end function find_WeekdaysFromThisTo
public function set_Day($newday) {
if (is_int($newday) && $newday > 0 && $newday < 32 && checkdate($this->format(''m''),$newday,$this->format(''Y'')))
$this->setDate($this->format(''Y''),$this->format(''m''),$newday);
} // end function set_Day
public function set_Month($newmonth) {
if (is_int($newmonth) && $newmonth > 0 && $newmonth < 13)
$this->setDate($this->format(''Y''),$newmonth,$this->format(''d''));
} // end function set_Month
public function set_Year($newyear) {
if (is_int($newyear) && $newyear > 0)
$this->setDate($newyear,$this->format(''m''),$this->format(''d''));
} // end function set_Year
} // end class Extended_DateTime