Funzione NOW () in PHP


479

Esiste una funzione PHP che restituisce la data e l'ora nello stesso formato della funzione MySQL NOW()?

So come farlo usando date(), ma chiedo se esiste una funzione solo per questo.

Ad esempio, per restituire:

2009-12-01 00:00:00

2
Buona domanda. Semplice ma efficace nel mettere in evidenza le soluzioni dateTime che ogni programmatore fatica a ricordare.
Sweet Chilly Philly,

Risposte:



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

Guarda qui per maggiori dettagli: http://pl.php.net/manual/en/function.date.php


3
Vorrei sottolineare come sia tu che @troelskn avete inviato la stessa risposta il 3 gennaio 2010 alle 17:08, ma ha ottenuto ancora 800 voti in più. La tua risposta alla domanda era probabilmente a pochi secondi dalla sua. :) Grazie per averlo scritto comunque: D
Aleksandar,

9 secondi dopo (visibile se si passa con il mouse sulla "risposta" etichettata)
Grzegorz Oledzki

110

Con la versione di PHP> = 5.4 DateTime può fare questo: -

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

Vedi che funziona .


4
bella idea avvolgendo il costruttore e formattandolo nel modo giusto.
Acme,

finalmente php ha iniziato a copiare da delphi ec # :)
Erçin Dedeoğlu il

1
questo può essere carino, ma non risponde affatto alla domanda, non è più facile né più veloce farlo in questo modo
Asped

8
@Asped In che modo non risponde alla domanda? È una funzione PHP che "restituisce la data e l'ora nello stesso formato della funzione MySQL NOW ()", che è proprio la domanda.
vascowhite,

@vascowhite - la domanda era se esiste una funzione specifica per questo scopo. quindi la risposta è no. tutte le altre possibilità elencate qui potrebbero funzionare e anche la tua è bella, ma non aiuta, dato che il ragazzo che ha già chiesto sapeva un modo per farlo, ma voleva una funzione più semplice e monouso, che la tua non è :)
Asped il

34

Usa questa funzione:

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

Risposta breve

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

Leggi sotto per la risposta lunga.




Il mimetismo della funzione MySQL NOW () in PHP

Ecco un elenco di modi in PHP che imitano la NOW()funzione 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);

Penso che date_create()->format('Y-m-d H:i:s')sia il modo migliore perché questo approccio consente di gestire le manipolazioni di fuso orario / fuso orario più facilmente di date('Y-m-d H:i:s')e funziona da php 5.2.


MySQL NOW () funzione

La funzione di MySQL NOW()fornisce il valore dateTime in questo formato: 'YYYY-MM-DD HH:MM:SS'. Vedi qui: https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_now .

Un fatto interessante è che è possibile ottenere il formato datetime eseguendo questa query:, SHOW VARIABLES LIKE 'd%e_format'il risultato potrebbe essere qualcosa del genere:

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

Le variabili qui sono variabili di sola lettura. Quindi non puoi cambiarlo.

Immagino che la NOW()funzione MySQL ottenga il suo formato dalla datetime_formatvariabile.




I vantaggi di date_create () -> format () invece del sommario date ()

I fatti favorevoli di date_create('now')->format('Y-m-d H:i:s')over date('Y-m-d H:i:s')sono:

  • più facile da gestire manipolazioni del tempo
  • più facile da gestire fusi orari
  • oop

Gli svantaggi di date_create () -> format () invece di date ()

La funzione date()ha prestazioni leggermente migliori rispetto a date_create()->format(). Vedi test benchmark di seguito.

$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

Il maiuscolo mostra che date()è più veloce. Tuttavia, se cambiamo un po 'lo scenario di test, il risultato sarà diverso. Vedi sotto:

$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

Il metodo DateTime: format()qui è più veloce di date().




I vantaggi di date_create () -> format () invece di date () sono dettagliati

Continua a leggere per la spiegazione dettagliata.

più facile da gestire manipolazioni del tempo

date_create()accetta un formato di data relativa / tempo (come now, yesterdayo +1 day) vedi questo link , ad esempio:

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

date() accetta anche un formato data / ora relativo, in questo modo:

$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

più facile da gestire fusi orari

Quando fusi orari importa quindi l'utilizzo di date_create()->format()marche molto più senso allora date()perché date()usi il fuso orario predefinito che si configura in php.inipresso la date.timezonedirettiva. Link: http://php.net/manual/en/datetime.configuration.php#ini.date.timezone .

È possibile modificare il fuso orario durante il runtime. Esempio:

date_default_timezone_set('Asia/Tokyo');.

Il rovescio della medaglia è che influenzerà tutte le funzioni di data / ora. Questo problema non esiste se si utilizza date_create()->format()in combinazione con timezone_open().

PHP supporta i principali fusi orari. La cosa divertente è che supporta persino il circolo polare artico e l'Antartide. Ne hai mai sentito parlare Longyearbyen? In caso contrario, non ti preoccupare, nemmeno fino a quando non ho letto la documentazione ufficiale di PHP.

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

Visualizza un elenco di tutti i fusi orari supportati: http://php.net/manual/en/timezones.php .

oop

OOP utilizza oggetti pieni di stato. Quindi preferisco pensare in questo modo:

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

Quindi pensare in questo modo:

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

Quindi direi che l' date_create()->format()approccio è più leggibile per me allora date().




date_create () VS new DateTime ()

I fatti favorevoli di date_create()over new DateTime()sono:

  • Namespace

Namespace

Se lavori in uno spazio dei nomi e desideri inizializzare un oggetto DateTime con la nuova parola chiave, devi farlo in questo modo:

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

Non c'è nulla di sbagliato in questo, ma il rovescio della medaglia di quanto sopra è che le persone dimenticano sporadicamente della barra rovesciata. Usando la date_create()funzione di costruzione non devi preoccuparti degli spazi dei nomi.

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




Esempio di date_create () -> format ()

Uso questo approccio per i miei progetti se devo riempire un array. Come questo:

$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

Stavo cercando la stessa risposta e ho trovato questa soluzione per PHP 5.3 o versioni successive:

$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 funzione MySQL NOW()restituisce il timestamp corrente. L'unico modo per trovare PHP è usare il seguente codice.

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

16

Un'altra risposta che trovo facile da usare:

echo date('c');

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

Questa è la data ISO 8601 (aggiunta in PHP 5) utilizzata da MySQL

modificare

MySQL 5.7 non consente il fuso orario nel datetime per impostazione predefinita. È possibile disabilitare l'errore con SQL_MODE=ALLOW_INVALID_DATES. Vedere la risposta qui per maggiori dettagli: https://stackoverflow.com/a/35944059/2103434 . Ma ciò significa anche che il fuso orario andrà perso durante il salvataggio nel database!

Per impostazione predefinita, MySQL utilizza il fuso orario del sistema e fintanto che PHP utilizza lo stesso fuso orario , dovresti essere a posto. Nel mio caso CET / UTC + 2.

Ciò significa che se inserisco 2015-07-27T00:00:00+02:00nel database, 2015-07-27T00:00:00verrà memorizzato solo (ma questa è l'ora locale corretta!).

Quando carico nuovamente il tempo su PHP,

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

assumerà automaticamente il suo +02:00fuso orario poiché è l'impostazione predefinita. La stampa sarà di nuovo corretta:

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

Per sicurezza, usa sempre UTC sul server, specificalo in MySQL e PHP, quindi convertilo solo nelle impostazioni locali dell'utente quando visualizzi la 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

Oppure puoi usare le DateTimecostanti :

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

Ecco l'elenco di loro:

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

Per il debug preferisco però uno più corto ( 3v4l.org ):

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

6

Mi piace la soluzione pubblicata da user1786647 e l'ho aggiornata un po 'per cambiare il fuso orario in un argomento di funzione e aggiungere il supporto opzionale per passare una stringa di tempo Unix o datetime da usare per il datestamp restituito.

Include anche un fallback per "setTimestamp" per gli utenti che eseguono una versione inferiore 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

Puoi utilizzare la funzione di data PHP con il formato corretto come parametro,

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

1

Non esiste una now()funzione PHP integrata, ma puoi farlo usando date().

Esempio

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

È possibile utilizzare date_default_timezone_set()se è necessario modificare il fuso orario.

Altrimenti puoi usare Carbon - Una semplice estensione API PHP per DateTime.


0

Se vuoi avere tempo ora incluso AM / PM

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

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

o

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

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


-1

in breve

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

php avanzato ora classe extra addMinute addYear come tale addHour ecc ...

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

}




utilizzando

  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

Perché qualcuno dovrebbe aver bisogno di un'intera classe per qualcosa che può essere completamente soddisfatto in una riga di codice?!? Se qualcosa in questo TLDR ha valore, è la risposta giusta alla domanda sbagliata.
Mickmackusa,

perché ora è sempre oggetto
dılo sürücü

L'OP ha richiesto solo una stringa di data formattata specifica. Niente di più. Nessuna manipolazione di data / ora. Questa è la risposta giusta alla domanda sbagliata.
Mickmackusa,

ripeto il codice modificato, guarda il codice ...
13 gennaio

La modifica ha copiato la soluzione suggerita da 3 delle prime 5 risposte in questa pagina. Stai contribuendo al gonfiamento della pagina (contenuto ridondante e consigli fuori ambito) e questo non è un bene per StackOverflow.
mickmackusa,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.