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.