Função NOW () em PHP


479

Existe uma função PHP que retorna a data e hora no mesmo formato que a função MySQL NOW()?

Eu sei como fazê-lo usando date(), mas estou perguntando se existe uma função apenas para isso.

Por exemplo, para retornar:

2009-12-01 00:00:00

2
Boa pergunta. Simples, mas eficaz para apresentar as soluções dateTime abaixo que todo programador luta para se lembrar.
Sweet Chilly Philly

Respostas:



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

Veja aqui mais detalhes: http://pl.php.net/manual/en/function.date.php


3
Eu gostaria de enfatizar como você e @troelskn enviaram a mesma resposta em 3 de janeiro de 2010 às 17:08, mas ele ainda obteve ~ 800 votos a mais. O envio da sua resposta foi provavelmente segundos a menos do dele. :) Obrigado por escrever de qualquer maneira: D
Aleksandar

9 segundos depois (visível se você passar o mouse "respondido")
Grzegorz Oledzki

110

Com a versão PHP> = 5.4, o DateTime pode fazer isso: -

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

Veja trabalhando .


4
boa ideia envolver o construtor e formatá-lo da maneira certa.
Acme

enfim php começou a copiar a partir de Delphi e C # :)
Erçin Dedeoğlu

1
isso pode ser bom, mas não responde à pergunta, não é mais fácil nem mais rápido fazê-lo dessa maneira #
582

8
@ Asped De que forma isso não responde à pergunta? É uma função PHP que "retorna a data e hora no mesmo formato que a função MySQL NOW ()", que é precisamente a questão.
precisa saber é o seguinte

@vascowhite - a questão era se existe uma função específica para esse propósito. então a resposta é NÃO. todas as outras possibilidades listadas aqui podem estar funcionando e a sua também é boa, mas não ajuda, pois o cara que perguntava já sabia como fazê-lo, mas queria uma função mais simples e única, que a sua não é :)
Asped

34

Use esta função:

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

Tente o seguinte:

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

181
Certo, se você desperdiçar personagens assim, ficaremos sem eles.
quer

4
sim meu mau tempo () actualy não é necessário
streetparade

15
8 caracteres, na verdade.
Henrik Erlandsson

52
considerando todo o lixo por aqui, acho que é muito vergonhoso ele usou aspas
Augie Gardner

37
Imagine todos os personagens desperdiçados em comentar sobre o desperdício de personagens!
Pwnball

25

Resposta curta

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

Leia abaixo a resposta longa.




A imitação da função NOW () do MySQL no PHP

Aqui está uma lista de maneiras no PHP que imitam a NOW()função 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);

Eu acho que date_create()->format('Y-m-d H:i:s')é a melhor maneira, porque essa abordagem permite que você lide com manipulações de fuso horário / fuso horário com mais facilidade do que date('Y-m-d H:i:s')e funciona desde o php 5.2.


Função MySQL NOW ()

A função MySQL NOW()fornece o valor dateTime neste formato: 'YYYY-MM-DD HH:MM:SS'. Consulte aqui: https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_now .

Um fato interessante é que é possível obter o formato datetime executando esta consulta:, SHOW VARIABLES LIKE 'd%e_format'o resultado pode ser algo como isto:

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

As variáveis ​​aqui em cima são variáveis ​​somente leitura. Então você não pode mudar isso.

Eu acho que a NOW()função MySQL obtém o formato da datetime_formatvariável.




As vantagens do date_create () -> format () em vez do date () resumo

Os fatos favoráveis ​​do date_create('now')->format('Y-m-d H:i:s')excesso date('Y-m-d H:i:s')são:

  • mais fácil de lidar com manipulações de tempo
  • mais fácil de lidar com fusos horários
  • oop

As desvantagens de date_create () -> format () em vez de date ()

A função date()tem um desempenho um pouco melhor que date_create()->format(). Veja teste de benchmark abaixo.

$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

A maiúscula mostra que date()é mais rápido. No entanto, se mudarmos um pouco o cenário de teste, o resultado será diferente. Ver abaixo:

$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

O método DateTime: format()é mais rápido aqui do que date().




As vantagens de date_create () -> format () em vez de date () detalhadas

Continue lendo para obter uma explicação detalhada.

mais fácil de lidar com manipulações de tempo

date_create()aceita um formato de data relativa / hora (como now, yesterdayou +1 day) ver este link , por exemplo:

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

date() aceita também um formato de data / hora relativo, assim:

$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

mais fácil de lidar com fusos horários

Quando fusos horários importa então o uso de date_create()->format()marcas muito mais sentido, em seguida, date()porque date()usa o fuso horário padrão que é configurado no php.inina date.timezonedirectiva. Link: http://php.net/manual/en/datetime.configuration.php#ini.date.timezone .

É possível alterar o fuso horário durante o tempo de execução. Exemplo:

date_default_timezone_set('Asia/Tokyo');.

A desvantagem disso é que isso afetará todas as funções de data / hora. Esse problema não existe se você estiver usando date_create()->format()em combinação com timezone_open().

O PHP suporta os principais fusos horários. O engraçado é que ele ainda suporta o círculo ártico e a Antártica. Você já ouviu falar sobre isso Longyearbyen? Caso contrário, não se preocupe, nem o fiz até ler a documentação oficial do PHP.

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

Veja uma lista de todos os fusos horários suportados: http://php.net/manual/en/timezones.php .

oop

OOP usa objetos com estado completo. Então, prefiro pensar dessa maneira:

// 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'); 

Então, pense desta maneira:

// 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'));

Portanto, eu diria que a date_create()->format()abordagem é mais legível para mim date().




date_create () VS novo DateTime ()

Os fatos favoráveis ​​do date_create()excesso new DateTime()são:

  • Namespaces

Namespaces

Se você trabalha em um espaço para nome e deseja inicializar um objeto DateTime com a nova palavra-chave, faça o seguinte:

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();

Não há nada de errado nisso, mas a desvantagem acima é que as pessoas esquecem esporadicamente a barra invertida. Usando a date_create()função construtora, você não precisa se preocupar com espaços para nome.

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




Exemplo de date_create () -> format ()

Eu uso essa abordagem para meus projetos se precisar preencher uma matriz. Como isso:

$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

Eu estava procurando a mesma resposta e encontrei esta solução para o PHP 5.3 ou 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

A função MySQL NOW()retorna o registro de data e hora atual. A única maneira que encontrei para o PHP é usando o código a seguir.

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

16

Acho que mais uma resposta é fácil de usar:

echo date('c');

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

Esta é a data da ISO 8601 (adicionada no PHP 5) que o MySQL usa

Editar

O MySQL 5.7 não permite o fuso horário na data e hora por padrão. Você pode desativar o erro com SQL_MODE=ALLOW_INVALID_DATES. Veja a resposta aqui para obter mais detalhes: https://stackoverflow.com/a/35944059/2103434 . Mas isso também significa que o fuso horário será perdido ao salvar no banco de dados!

Por padrão, o MySQL usa o fuso horário do sistema e, enquanto o PHP usa o mesmo fuso horário, você deve ficar bem. No meu caso, CET / UTC + 2.

Isso significa que, se eu inserir 2015-07-27T00:00:00+02:00no banco de dados, apenas 2015-07-27T00:00:00serão armazenados (mas essa é a hora local correta!).

Quando carrego o tempo de volta no PHP,

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

assumirá automaticamente seu +02:00fuso horário, já que é o padrão. Imprimir isso estará correto novamente:

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

Para estar seguro, sempre use o UTC no servidor, especifique-o no MySQL e PHP e depois converta-o para a localidade do usuário ao exibir a data:

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

Ou você pode usar DateTimeconstantes :

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

Aqui está a lista deles:

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

Para depuração, prefiro uma versão mais curta ( 3v4l.org ):

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

6

Gosto da solução postada por user1786647 e atualizei-a um pouco para alterar o fuso horário para um argumento de função e adicionar suporte opcional para passar uma seqüência de horário ou hora do Unix para usar no carimbo de data e hora retornado.

Ele também inclui um fallback para "setTimestamp" para usuários que executam versão inferior ao 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

Você pode usar a função de data PHP com o formato correto como parâmetro,

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

1

Não há now()função PHP embutida, mas você pode fazê-lo usando date().

Exemplo

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

Você pode usar date_default_timezone_set()se precisar alterar o fuso horário.

Caso contrário, você poderá usar o Carbon - uma extensão simples da API do PHP para o DateTime.


0

Se você deseja obter tempo agora, incluindo AM / PM

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

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

ou

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

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


-1

Em breve

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

PHP avançado agora classe 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();

}




usando

  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 que alguém precisaria de uma classe inteira para algo que possa ser completamente satisfeito em uma linha de código?!? Se alguma coisa neste TLDR é valiosa, é a resposta certa para a pergunta errada.
mickmackusa 12/03

porque agora é objeto toda vez
dılo sürücü 12/03

O OP solicitou apenas uma sequência de datas formatada específica. Nada mais. Nenhuma manipulação de data / hora. Esta é a resposta certa para a pergunta errada.
mickmackusa 12/03

Eu editei o código, repito, olhe o código ...
dılo sürücü 13/03

Sua edição copiou a solução sugerida de 3 das 5 principais respostas desta página. Você está contribuindo para o inchaço da página (conteúdo redundante e conselhos fora do escopo) e isso não é bom para o Stackoverflow.
mickmackusa 13/03

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.