una - php fecha actual español
Gestión de diferencias de formatos de fecha entre PHP y MySQL (7)
Estoy escribiendo mi primera aplicación PHP que tiene que lidiar directamente con las fechas y, por lo tanto, lidiar directamente con el hecho de que PHP y MySQL tienen diferentes formatos de fecha.
Mi pregunta es: ¿cuál es la forma más elegante de gestionar esta diferencia?
Tengo las siguientes dos funciones para administrar la diferencia usando php:
function mysql_date($php_date) {
return date( ''Y-m-d H:i:s'', $php_date );
}
function php_date($mysql_date) {
$val = explode(" ",$mysql_date);
$date = explode("-",$val[0]);
$time = explode(":",$val[1]);
return mktime($time[0],$time[1],$time[2],$date[1],$date[2],$date[0]);
}
¿Hay alguna forma más sencilla de administrar esto directamente en mis consultas SQL?
¿O podría sugerir alguna otra forma más elegante de gestionar esto?
Almacene todo en la base de datos en un campo de fecha y hora en UTC. Para la manipulación de PHP, use la biblioteca PEAR Date . No soy un gran usuario de PEAR, pero esta biblioteca es fantástica y manejará todos los molestos problemas de conversión de fechas con los que no deberías pasar el tiempo preocupándote.
Creo que sería una mejor idea almacenar las marcas de tiempo de Unix en el campo DB. Cuando necesite mostrar las fechas en el lenguaje humano, siempre puede usar la función date de php (). Para todo lo demás, solo usa la marca de tiempo numérica.
Desde (alrededor) PHP 5.2, PHP tiene una clase / objeto incorporado para tratar fechas y horas, llamado DateTime . En un vacío, siempre es mejor usar un built-in que disputar con los detalles desordenados usted mismo.
El constructor DateTime (o la función date_create) acepta una fecha en cualquier formato entendido por strToTime. Todo lo que necesita saber sobre strToTime es que es un vudú mágico que reconocerá correctamente una fecha en casi cualquier formato de cadena. La primera vez que me encontré con StrToTime tuve la misma reacción interna que estás teniendo ahora ("eso es una mierda / parece poco confiable"). No es. Simplemente funciona de manera que su propia comprensión frágil de las fechas nunca lo hará (y si cree que comprende las fechas, no lo hace. Confíe en mí).
Por lo tanto, extraiga la información de MySQL como una cadena de fecha y hora, e inmediatamente cree un objeto de fecha PHP. Use el método date_format (con algunas constantes útiles ) cuando / si necesita la fecha nuevamente como una cadena.
Le recomendaría que mantenga todo en formato mysql hasta que necesite mostrarlo al usuario, luego use strtotime () para obtener una marca de tiempo y fecha () para formatearlo.
Si arrojas algo de notación húngara, es aún más difícil equivocarte:
$ymdDateAdded = date(''Y-m-d'');
$timeDateAdded = strtotime($ymdDateAdded);
$userDateadded = date(''j F Y'', $timeDateAdded);
Podría hacer un pequeño objeto de fecha que simplemente convierta la fecha como la necesita
$Date_p = new MagicDate($php_date);
$Date_m = new MagicDate($mysql_date);
$Date_p
y $Date_m
solo muestran que puedes sembrar el objeto de todas formas que necesites. Cuando quieras una fecha de mysql tendrías un código como. Siendo realistas, sería algo muy genérico como $Date
.
$query = "UPDATE SET Date=''".$Date_p->toMysql()."'' "...
y viceversa cuando necesitas lo opuesto. Puede usar las funciones que ya ha creado. Simplemente agregue un "sniffer" en el método de construir como:
public function __construct($date)
{
$phpdate = strtotime($date);
if($phpdate)
{
$this->phpdate = $phpdate;
$this->mysqldate = $this->mysql_date($phpdate);
}
else
{
$this->phpdate = $this->php_date($phpdate);
$this->mysqldate = $phpdate;
}
}
Tira un poco de manejo de errores para atrapar las cosas que van mal. Agregue el captador para las dos fechas. Y es un conjunto y olvidarlo situación. Simplemente saque la fecha correcta cuando lo necesite.
Puede haber algunas optimizaciones, pero esto es para mostrarle cómo podría funcionar.
Puede reemplazar php_date
con strtotime
.
$php = strtotime($mysql);
El equivalente de MySQL sería UNIX_TIMESTAMP
.
Sin embargo, si desea manejar el formateo en SQL, intente con DATE_FORMAT
de MySQL.
Es la mejor forma de guardar la hora y la fecha como sello de tiempo de Unix en lugar de otros formatos.
Creé una clase para manejar la fecha y la hora en php. Es fácil de usar y muy, muy útil
<?php
define("NEW_LINE", "</BR>");
class scTimestamp
{
private $timestamp;
private $year;
private $month;
private $day;
private $hour;
private $minute;
private $second;
public function __construct()
{
register_shutdown_function(array($this,''__destruct''));
$this->setTimestamp($_SERVER[''REQUEST_TIME'']);
}
public function __destruct()
{
unset($this->timestamp);
unset($this->year);
unset($this->month);
unset($this->day);
unset($this->hour);
unset($this->minute);
unset($this->second);
}
private function rebuildTimestampFromDate()
{
$this->timestamp=mktime($this->hour,$this->minute,$this->second,$this->month,$this->day,$this->year);
}
private function rebuildDateFromTimestamp()
{
$this->day=date(''j'',$this->timestamp);
$this->month=date(''n'',$this->timestamp);
$this->year=date(''Y'',$this->timestamp);
$this->hour=date(''g'',$this->timestamp);
$this->minute=date(''G'',$this->timestamp);
$this->second=date(''s'',$this->timestamp);
}
public function setTimestamp($tempTimestamp)
{
$this->timestamp=$tempTimestamp;
$this->rebuildDateFromTimestamp();
}
public function getTimestamp()
{
return $this->timestamp;
}
public function setYear($tempYear)
{
$this->year = $tempYear;
$this->rebuildTimestampFromDate();
}
public function getYear()
{
return $this->year;
}
public function setMonth($tempMonth)
{
$this->month = $tempMonth;
$this->rebuildTimestampFromDate();
}
public function getMonth()
{
return $this->month;
}
public function setDay($tempDay)
{
$this->day=$tempDay;
$this->rebuildTimestampFromDate();
}
public function getDay()
{
return $this->day;
}
public function setHour($tempHour)
{
$this->hour = $tempHour;
$this->rebuildTimestampFromDate();
}
public function getHour()
{
return $this->hour;
}
public function setMinute($tempMinute)
{
$this->minute = $tempMinute;
$this->rebuildTimestampFromDate();
}
public function getMinute()
{
return $this->minute;
}
public function setSecond($tempSecond)
{
$this->second = $tempSecond;
$this->rebuildTimestampFromDate();
}
public function getSecond()
{
return $this->second;
}
public function getDateDifferenceFromNow()
{
return $this->getDateDifferenceFrom($_SERVER[''REQUEST_TIME'']);
}
public function getDateDifferenceFrom($fromDate)
{
$return="";
$sec=" Second";
$min=" Minute";
$hrs=" Hour";
$before=" Before";
$difference=$fromDate-$this->getTimestamp();
if($difference<0)
$return.="In the Future";
else if($difference<60)
{
if($difference>1)
$sec.="s";
$return.= $difference.$sec.$before;
}
else if($difference<3600)
{
$difference=intval($difference/60);
if($difference>1)
$min.="s";
$return.=$difference.$min.$before;
}
else if($difference<86400)
{
$difference=intval($difference/3600);
if($difference>1)
$hrs.="s";
$return= $difference.$hrs.$before;
}
else if($difference<604800)
{
$return.= date("l g:i a",$this->getTimestamp());
}
else if($difference<28512000)
{
$return.= date("F j",$this->getTimestamp());
}
else
{
$return.= date("F j, Y, g:i a",$this->getTimestamp());
}
return $return;
}
public function getDateAsString()
{
return date("F j, Y",$this->getTimestamp());
}
public function getDateTimeAsString()
{
return date("F j, Y, g:i a",$this->getTimestamp());
}
public function __toString()
{
$return = NEW_LINE."^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^";
$return.= NEW_LINE." ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^".NEW_LINE;
$return.= NEW_LINE."@@ Timestamp: ".$this->getTimestamp()." @@".NEW_LINE;
$return.= NEW_LINE."@@ Date: ".$this->getDateTimeAsString()." @@".NEW_LINE;
$return.= NEW_LINE." ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^".NEW_LINE;
return $return;
}
}
?>
una vez que está incluido, puede usarse como sigue
include_once("scTimestamp.php");
$test=new scTimestamp();
echo $test->getDateAsString();
$test->setTimestamp(1210203200);
echo $test->getDateDifferenceFromNow();
echo $test;
$test->setTimestamp(121020320022);
echo $test->getYear();
echo $test;
Y al resultado le gustaría esto.
26 de junio de 2015, 7 de mayo de 2008, 11:33 p.m. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^ @@ Timestamp: 1210203200 @@@@ Fecha: 7 de mayo de 2008, 11:33 pm @@ ^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @ @ Timestamp: 121020320022 @@ @@ Fecha : 25 de diciembre de 5804, 3:33 am @@ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Esta clase se puede usar según las necesidades