Función NOW () en PHP


479

¿Existe una función PHP que devuelva la fecha y la hora en el mismo formato que la función MySQL NOW()?

Sé cómo hacerlo usando date(), pero estoy preguntando si hay una función solo para esto.

Por ejemplo, para volver:

2009-12-01 00:00:00

2
Buena pregunta. Simple pero efectivo para presentar las siguientes soluciones de fecha y hora que todo programador lucha por recordar.
Sweet Chilly Philly

Respuestas:



143
date('Y-m-d H:i:s')

Mire aquí para más detalles: http://pl.php.net/manual/en/function.date.php


3
Me gustaría enfatizar cómo tanto Usted como @troelskn enviaron la misma respuesta el 3 de enero del año 2010. a las 17:08, pero aún recibió ~ 800 votos a favor más. Su respuesta fue probablemente unos segundos aparte de la suya. :) Gracias por escribirlo de todos modos: D
Aleksandar

9 segundos después (visible si coloca el cursor sobre la etiqueta "contestado")
Grzegorz Oledzki

110

Con la versión PHP> = 5.4 DateTime puede hacer esto: -

echo (new \DateTime())->format('Y-m-d H:i:s');

Véalo trabajando .


44
buena idea envolviendo el constructor y formateándolo correctamente.
acme

por fin php comenzó a copiar desde delphi y c # :)
Erçin Dedeoğlu

1
Esto puede ser agradable, pero no responde a la pregunta en absoluto, no es más fácil ni más rápido hacerlo de esta manera
Aspedido el

8
@Asped ¿De qué manera no responde la pregunta? Es una función PHP que "devuelve la fecha y la hora en el mismo formato que la función MySQL NOW ()", que es precisamente la pregunta.
vascowhite

@vascowhite: la pregunta era si hay una función específica para este propósito. Por tanto, la respuesta es no. todas las otras posibilidades enumeradas aquí pueden estar funcionando y la suya también es agradable, pero no ayuda, ya que el tipo que preguntaba ya sabía cómo hacerlo, pero quería una función más sencilla y de un solo propósito, que la suya no es :)
Aspedió el

34

Utiliza esta función:

function getDatetimeNow() {
    $tz_object = new DateTimeZone('Brazil/East');
    //date_default_timezone_set('Brazil/East');

    $datetime = new DateTime();
    $datetime->setTimezone($tz_object);
    return $datetime->format('Y\-m\-d\ h:i:s');
}

25

Prueba esto:

date("Y-m-d H:i:s");

181
Bien, si desperdicias personajes como ese, nos quedaremos sin ellos.
Bill Karwin

44
sí, mi mal, el tiempo () no es realmente necesario
streetparade

15
8 personajes, en realidad.
Henrik Erlandsson

52
considerando todos los desperdicios por aquí, me parece bastante vergonzoso que haya usado comillas dobles
Augie Gardner

37
¡Imagina todos los personajes desperdiciados al comentar sobre el desperdicio de personajes!
Pwnball

25

Respuesta corta

$now = date_create()->format('Y-m-d H:i:s');

Lea a continuación la respuesta larga.




La imitación de la función MySQL NOW () en PHP

Aquí hay una lista de formas en PHP que imitan la NOW()función MySQL .

// relative date
$now = date_create('now')->format('Y-m-d H:i:s'); // works in php 5.2 and higher  
$now = date_create()->format('Y-m-d H:i:s'); // also works in php 5.2
$now = new DateTime('now')->format('Y-m-d H:i:s'); // syntax error!!!
$now = (new DateTime('now'))->format('Y-m-d H:i:s'); // works in php 5.4 and higher   
$now = date('Y-m-d H:i:s'); // Slightly higher performance, but less usable for date/time manipulations

// From Unix timestamp
// Using date_create() with a Unix timestamp will give you a FALSE,  
// and if you try to invoke format() on a FALSE then you'll get a: 
//     Fatal error: Call to a member function format() on boolean 
// So if you work with Unix timestamps then you could use: date_create_from_format().
$unixTimeStamp = 1420070400; // 01/01/2015 00:00:00
$y2015 = date_create_from_format('U', $unixTimeStamp, timezone_open('Europe/Amsterdam'))->format('Y-m-d H:i:s');
$y2015 = date('Y-m-d H:i:s', $unixTimeStamp);

Creo que date_create()->format('Y-m-d H:i:s')es la mejor manera porque este enfoque le permite manejar las manipulaciones de tiempo / zona horaria más fácilmente date('Y-m-d H:i:s')y funciona desde php 5.2.


Función MySQL NOW ()

La función de MySQL NOW()proporciona el valor fechaHora en este formato: 'YYYY-MM-DD HH:MM:SS'. Ver aquí: https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_now .

Un hecho interesante es que es posible obtener el formato de fecha y hora ejecutando esta consulta: SHOW VARIABLES LIKE 'd%e_format'el resultado podría ser algo como esto:

Variable_name     Value     
date_format       %Y-%m-%d
datetime_format   %Y-%m-%d %H:%i:%s

Las variables aquí arriba son variables de solo lectura. Entonces no puedes cambiarlo.

Supongo que la NOW()función MySQL obtiene su formato de la datetime_formatvariable.




Las ventajas de date_create () -> format () en lugar de date () resumen

Los hechos favorables de date_create('now')->format('Y-m-d H:i:s')más date('Y-m-d H:i:s')son:

  • manipulaciones de tiempo más fáciles de manejar
  • más fácil de manejar zonas horarias
  • oop

Las desventajas de date_create () -> format () en lugar de date ()

La función date()tiene un rendimiento ligeramente mejor que date_create()->format(). Ver prueba de referencia a continuación.

$start = time();
for ($i = 0; $i <= 5000000; $i++) {
    $a = date_create('now')->format('Y-m-d H:i:s');
}
$end = time();                  
$elapsedTimeA = $end - $start;

echo 'Case A, elapsed time in seconds: ' . $elapsedTimeA;
echo '<br>';

$start = time();
for ($i = 0; $i <= 5000000; $i++) {
    $b = date('Y-m-d H:i:s');
}
$end = time();                   
$elapsedTimeB = $end - $start;

echo 'Case B, elapsed time in seconds: ' . $elapsedTimeB;
echo '<br>';
// OUTPUT
Case A, elapsed time in seconds: 31
Case B, elapsed time in seconds: 14

La mayúscula muestra que date()es más rápido. Sin embargo, si cambiamos un poco el escenario de prueba, el resultado será diferente. Vea abajo:

$start = time();
$dt = date_create('now');
for ($i = 0; $i <= 5000000; $i++) {
    $a = $dt->format('Y-m-d H:i:s');
}
$end = time();                  
$elapsedTimeA = $end - $start;

echo 'Case A, elapsed time in seconds: ' . $elapsedTimeA;
echo '<br>';

$start = time();
for ($i = 0; $i <= 5000000; $i++) {
    $b = date('Y-m-d H:i:s');
}
$end = time();                   
$elapsedTimeB = $end - $start;

echo 'Case B, elapsed time in seconds: ' . $elapsedTimeB;
echo '<br>';
// OUTPUT
Case A, elapsed time in seconds: 14
Case B, elapsed time in seconds: 15

El método DateTime: format()es más rápido aquí que date().




Las ventajas de date_create () -> format () en lugar de date () detallado

Siga leyendo para obtener una explicación detallada.

manipulaciones de tiempo más fáciles de manejar

date_create()acepta un formato de fecha / hora relativo (como now, yesterdayo +1 day) vea este enlace , ejemplo:

$tomorrow = date_create('+1 day')->format('Y-m-d H:i:s'); 

date() también acepta un formato de fecha / hora relativo, como este:

$tomorrow = date('Y-m-d H:i:s', strtotime('+1 day'));
$tomorrow = date('Y-m-d H:i:s', (time() + 86400)); // 86400 seconds = 1 day

más fácil de manejar zonas horarias

Cuando las zonas horarias son importantes, el uso de date_create()->format()tiene mucho más sentido date()porque date()utiliza la zona horaria predeterminada que está configurada en php.inila date.timezonedirectiva. Enlace: http://php.net/manual/en/datetime.configuration.php#ini.date.timezone .

Es posible cambiar la zona horaria durante el tiempo de ejecución. Ejemplo:

date_default_timezone_set('Asia/Tokyo');.

La desventaja de esto es que afectará todas las funciones de fecha / hora. Este problema no existe si está usando date_create()->format()en combinación contimezone_open() .

PHP admite las principales zonas horarias. Lo curioso es que incluso es compatible con el círculo polar ártico y la Antártida. ¿Alguna vez has oído hablar Longyearbyen? Si no, entonces no se preocupe, yo tampoco hasta que leí la documentación oficial de PHP.

$nowLongyearbyen = date_create('now', timezone_open('Arctic/Longyearbyen'))->format('Y-m-d H:i:s');

Consulte una lista de todas las zonas horarias compatibles: http://php.net/manual/en/timezones.php .

oop

OOP utiliza objetos con estado completo. Entonces prefiero pensar de esta manera:

// Create a DateTime Object. 
// Use the DateTime that applies for tomorrow.
// Give me the datetime in format 'Y-m-d H:i:s'
$tomorrow = date_create('+1 day')->format('Y-m-d H:i:s'); 

Entonces pensar de esta manera:

// Give me a date time string in format 'Y-m-d H:i:s', 
// use strtotime() to calculate the Unix timestamp that applies for tomorrow.
$tomorrow = date('Y-m-d H:i:s', strtotime('+1 day'));

Por lo tanto, diría que el date_create()->format()enfoque es más legible para mí date().




date_create () VS new DateTime ()

Los hechos favorables de date_create()más new DateTime()son:

  • Espacios de nombres

Espacios de nombres

Si trabaja en un espacio de nombres y desea inicializar un objeto DateTime con la nueva palabra clave, debe hacerlo así:

namespace my_namespace;

// The backslash must be used if you are in a namespace.
// Forgetting about the backslash results in a fatal error.
$dt = new \DateTime();

No hay nada de malo en esto, pero la desventaja de lo anterior es que la gente olvida esporádicamente la barra invertida. Al usar la date_create()función de constructor no tiene que preocuparse por los espacios de nombres.

$dt = date_create(); // in or not in a namespace it works in both situations




Ejemplo de date_create () -> format ()

Utilizo este enfoque para mis proyectos si tengo que llenar una matriz. Me gusta esto:

$array = array(
    'name' => 'John',
    'date_time' => date_create('now')->format('Y-m-d H:i:s'), // uses the default timezone
    'date_time_japan' => date_create('now', timezone_open('Asia/Tokyo'))->format('Y-m-d H:i:s'),
);

18

Estaba buscando la misma respuesta y se me ocurrió esta solución para PHP 5.3 o posterior:

$dtz = new DateTimeZone("Europe/Madrid"); //Your timezone
$now = new DateTime(date("Y-m-d"), $dtz);
echo $now->format("Y-m-d H:i:s");

16

La función MySQL NOW()devuelve la marca de tiempo actual. La única forma que encontré para PHP es usando el siguiente código.

$curr_timestamp = date('Y-m-d H:i:s');

16

Una respuesta más que encuentro fácil de usar:

echo date('c');

// 2015-07-27T00:00:00+02:00

Esta es la fecha ISO 8601 (agregada en PHP 5) que utiliza MySQL

Editar

MySQL 5.7 no permite la zona horaria en la fecha y hora de forma predeterminada. Puede deshabilitar el error con SQL_MODE=ALLOW_INVALID_DATES. Vea la respuesta aquí para obtener más detalles: https://stackoverflow.com/a/35944059/2103434 .¡Pero eso también significa que la zona horaria se perderá al guardar en la base de datos!

Por defecto, MySQL usa la zona horaria del sistema, y ​​siempre que PHP use la misma zona horaria , debería estar bien. En mi caso CET / UTC + 2.

Eso significa que si inserto 2015-07-27T00:00:00+02:00en la base de datos, solo 2015-07-27T00:00:00se almacenará (¡pero esa es la hora local correcta!).

Cuando vuelvo a cargar el tiempo en PHP,

$importedDate = new \DateTime('2015-07-27T00:00:00')

asumirá automáticamente que es la +02:00zona horaria, ya que es la predeterminada. Imprimir esto será correcto nuevamente:

echo $importedDate->format('c');
// 2015-07-27T00:00:00+02:00

Para estar seguro, use siempre UTC en el servidor, especifíquelo en MySQL y PHP, y luego solo conviértalo a la configuración regional de su usuario cuando muestre la fecha:

date_default_timezone_set('UTC');
$importedDate = new \DateTime('2015-07-27T00:00:00+02:00');
echo $importedDate->format('c');
// 2015-07-27T00:00:00+02:00

$importedDate->setTimezone(new \DateTimeZone("America/New_York"));
echo $importedDate->format('c');
// 2015-07-26T18:00:00-04:00


11

O puedes usar DateTimeconstantes :

echo date(DateTime::W3C); // 2005-08-15T15:52:01+00:00

Aquí está la lista de ellos:

ATOM = "Y-m-d\TH:i:sP" ;               // -> 2005-08-15T15:52:01+00:00
COOKIE = "l, d-M-Y H:i:s T" ;          // -> Monday, 15-Aug-2005 15:52:01 UTC
ISO8601 = "Y-m-d\TH:i:sO" ;            // -> 2005-08-15T15:52:01+0000
RFC822 = "D, d M y H:i:s O" ;          // -> Mon, 15 Aug 05 15:52:01 +0000
RFC850 = "l, d-M-y H:i:s T" ;          // -> Monday, 15-Aug-05 15:52:01 UTC
RFC1036 = "D, d M y H:i:s O" ;         // -> Mon, 15 Aug 05 15:52:01 +0000
RFC1123 = "D, d M Y H:i:s O" ;         // -> Mon, 15 Aug 2005 15:52:01 +0000
RFC2822 = "D, d M Y H:i:s O" ;         // -> Mon, 15 Aug 2005 15:52:01 +0000
RFC3339 = "Y-m-d\TH:i:sP" ;            // -> 2005-08-15T15:52:01+00:00 ( == ATOM)
RFC3339_EXTENDED = "Y-m-d\TH:i:s.vP" ; // -> 2005-08-15T15:52:01.000+00:00
RSS = "D, d M Y H:i:s O" ;             // -> Mon, 15 Aug 2005 15:52:01 +0000
W3C = "Y-m-d\TH:i:sP" ;                // -> 2005-08-15T15:52:01+00:00

Sin embargo, para la depuración prefiero una más corta ( 3v4l.org ):

echo date('ymd\THisP'); // 180614T120708+02:00

6

Me gusta la solución publicada por user1786647, y la actualicé un poco para cambiar la zona horaria a un argumento de función y agregar soporte opcional para pasar una cadena de hora Unix o datetime para usar para el sello de fecha devuelto.

También incluye una alternativa para "setTimestamp" para usuarios que ejecutan versiones inferiores a PHP 5.3:

function DateStamp($strDateTime = null, $strTimeZone = "Europe/London") {
    $objTimeZone = new DateTimeZone($strTimeZone);

    $objDateTime = new DateTime();
    $objDateTime->setTimezone($objTimeZone);

    if (!empty($strDateTime)) {
        $fltUnixTime = (is_string($strDateTime)) ? strtotime($strDateTime) : $strDateTime;

        if (method_exists($objDateTime, "setTimestamp")) {
            $objDateTime->setTimestamp($fltUnixTime);
        }
        else {
            $arrDate = getdate($fltUnixTime);
            $objDateTime->setDate($arrDate['year'], $arrDate['mon'], $arrDate['mday']);
            $objDateTime->setTime($arrDate['hours'], $arrDate['minutes'], $arrDate['seconds']);
        }
    }
    return $objDateTime->format("Y-m-d H:i:s");
}

6

Puede usar la función de fecha PHP con el formato correcto como parámetro,

echo date("Y-m-d H:i:s");

1

No hay una now()función PHP incorporada, pero puede hacerlo usando date().

Ejemplo

function now() {
    return date('Y-m-d H:i:s');
}

Puede usarlo date_default_timezone_set()si necesita cambiar la zona horaria.

De lo contrario, puede utilizar Carbon : una extensión simple de la API de PHP para DateTime.


0

Si desea obtener tiempo ahora, incluido AM / PM

<?php 
    $time_now = date("Y-m-d h:i:s a");
    echo $time_now;
?>

Sale 2020-05-01 05:45:28 pm

o

<?php 
    $time_now = date("Y-m-d h:i:s A");
    echo $time_now;
?>

Sale 2020-05-01 05:45:28 PM


-1

dentro de poco

echo date('Y-m-d H:i:s');

php advanced now class extra addMinute addYear como tal addHour, etc.

<?php /** @noinspection PhpUnhandledExceptionInspection */

/**
 * Class Now
 * @author  dılo sürücü <berxudar@gmail.com>
 */
class Now
{

    /**
     * @var DateTime
     */
    private $dateTime;

    /**
     * Now constructor.
     * @throws Exception
     */
    public function __construct()
    {
        $this->dateTime = new DateTime('now');
    }


    /**
     * @param int $year
     * @return Now
     * @throws Exception
     * @noinspection PhpUnused
     */
    public function addYear(int $year): self
    {
        $this->dateTime->add(new DateInterval('P' . $year . 'Y'));

        return $this;
    }

    /**
     * @noinspection PhpUnused
     * @param int $month
     * @return Now
     * @throws Exception
     * @noinspection PhpUnused
     */
    public function addMonth(int $month):self 
    {
        $this->dateTime->add(new DateInterval('P' . $month . 'M'));

        return $this;
    }

    /**
     * @param int $day
     * @return $this
     * @throws Exception
     */
    public function addDay(int $day): self
    {
        $this->dateTime->add(new DateInterval('P' . $day . 'D'));
        return $this;
    }

    /**
     * @noinspection PhpUnused
     * @param int $week
     * @return $this
     * @throws Exception
     */
    public function addWeek(int $week): self
    {
        return $this->addDay($week * 7);
    }

    /**
     * @noinspection PhpUnused
     * @param int $second
     * @return $this
     * @throws Exception
     */
    public function addSecond(int $second): self
    {
        $this->dateTime->add(new DateInterval('PT' . $second . 'S'));
        return $this;
    }

    /**
     * @param int $minute
     * @return $this
     * @throws Exception
     */
    public function addMinute(int $minute): self
    {
        $this->dateTime->add(new DateInterval('PT' . $minute . 'M'));
        return $this;
    }

    /**
     * @param int $hour
     * @return $this
     * @throws Exception
     */
    public function addHour(int $hour): self
    {
        $this->dateTime->add(new DateInterval('PT' . $hour . 'H'));
        return $this;
    }


    /**
     * @return string
     */
    public function get(): string
    {
        return $this->dateTime->format('Y-m-d H:i:s');
    }

    /**
     * @return string
     */
    public function __toString()
    {
        return $this->get();
    }

}


/**
 * @return Now
 * @throws Exception
 */
function now()
{
    return new Now();

}




utilizando

  echo now(); //2020-03-10 22:10


echo now()->addDay(1); //2020-03-11 22:10


echo now()->addDay(1)->addHour(1); // //2020-03-11 23:10


echo now()->addDay(1)->addHour(1)->addMinute(30); // //2020-03-11 23:40


echo now()->addDay(1)->addHour(1)->addMinute(30)->addSecond(10); // //2020-03-11 23:50

//or u can use get method for example

echo now()->addDay(1)->addHour(1)->addMinute(30)->get(); // //2020-03-11 23:40

¿Por qué alguien necesitaría una clase completa para algo que pueda satisfacerse por completo en una línea de código? Si algo en este TLDR es valioso, es la respuesta correcta a la pregunta incorrecta.
mickmackusa

porque ahora es objeto cada vez
dılo sürücü

El OP solo ha pedido una cadena de fecha con formato específico. Nada mas. Sin manipulaciones de fecha / hora. Esta es la respuesta correcta a la pregunta incorrecta.
mickmackusa

ı código editado repita mira el código ...
dılo sürücü

Su edición ha copiado la solución sugerida de 3 de las 5 respuestas principales en esta página. Está contribuyendo a la hinchazón de la página (contenido redundante y consejos fuera de alcance) y esto no es bueno para Stackoverflow.
mickmackusa

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.