Fonction NOW () en PHP

479

Existe-t-il une fonction PHP qui retourne la date et l'heure au même format que la fonction MySQL NOW() ?

Je sais comment le faire en utilisant date(), mais je demande s'il y a une fonction uniquement pour cela.

Par exemple, pour retourner:

2009-12-01 00:00:00
MoeAmine
la source
2
Bonne question. Simple mais efficace pour faire ressortir les solutions dateTime ci-dessous dont chaque programmeur a du mal à se souvenir.
Sweet Chilly Philly

Réponses:

1033

Outre la fonction date :

date("Y-m-d H:i:s");
troelskn
la source
54
Notez que vous devrez peut-être utiliser la date_default_timezone_setfonction
Michel Ayres
y a-t-il un nom de fonction maintenant () dans mysqli?
MindRoasterMir
143
date('Y-m-d H:i:s')

Regardez ici pour plus de détails: http://pl.php.net/manual/en/function.date.php

hsz
la source
3
Je voudrais souligner comment You et @troelskn ont envoyé la même réponse le 3 janvier 2010. à 17:08, mais il a quand même obtenu ~ 800 votes positifs de plus. Votre réponse a été probablement à quelques secondes de la sienne. :) Merci de l'avoir écrit quand même: D
Aleksandar
9 secondes plus tard (visible si vous survolez l'étiquette "répondu")
Grzegorz Oledzki
110

Avec la version PHP> = 5.4, DateTime peut le faire: -

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

Voyez-le fonctionner .

vascowhite
la source
4
belle idée d'envelopper le constructeur et de le formater comme il faut.
Acme
enfin php a commencé à copier depuis delphi et c # :)
Erçin Dedeoğlu
1
cela peut être bien, mais ne répond pas du tout à la question, ce n'est ni plus facile ni plus rapide de le faire de cette façon
Asped
8
@Asped En quoi ne répond-il pas à la question? C'est une fonction PHP qui "renvoie la date et l'heure dans le même format que la fonction MySQL NOW ()", c'est précisément la question.
vascowhite
@vascowhite - la question était de savoir s'il existe une fonction spécifique à cet effet. donc la réponse est non. toutes les autres possibilités énumérées ici peuvent fonctionner et la vôtre est également agréable, mais n'aide pas, car le gars qui le demandait savait déjà comment le faire, mais voulait une fonction plus simple et à usage unique, ce que la vôtre n'est pas :)
Asped
34

Utilisez cette fonction:

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');
}
user1786647
la source
25

Essaye ça:

date("Y-m-d H:i:s");
streetparade
la source
181
Bon, si vous perdez des personnages comme ça, nous allons en manquer.
Bill Karwin
4
yep my bad le temps () n'est vraiment pas nécessaire
streetparade
15
8 caractères, en fait.
Henrik Erlandsson
52
considérant tous les déchets ici, je trouve assez honteux qu'il ait utilisé des guillemets doubles
Augie Gardner
37
Imaginez tous les personnages gaspillés en commentant le gaspillage des personnages!
Pwnball
25

Réponse courte

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

Lisez ci-dessous pour la réponse longue.




Le mimétisme de la fonction MySQL NOW () en PHP

Voici une liste de façons en PHP qui imitent la NOW()fonction 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);

Je pense que date_create()->format('Y-m-d H:i:s')c'est la meilleure façon parce que cette approche vous permet de gérer plus facilement les manipulations temps / fuseau horaire date('Y-m-d H:i:s')et cela fonctionne depuis php 5.2.


Fonction MySQL NOW ()

La fonction MySQL NOW()donne la valeur dateTime dans ce format: 'YYYY-MM-DD HH:MM:SS'. Voir ici: https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_now .

Un fait intéressant est qu'il est possible d'obtenir le format datetime en exécutant cette requête:, SHOW VARIABLES LIKE 'd%e_format'le résultat pourrait être quelque chose comme ceci:

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

Les variables ici sont des variables en lecture seule. Vous ne pouvez donc pas le changer.

Je suppose que la NOW()fonction MySQL obtient son format à partir de la datetime_formatvariable.




Les avantages de date_create () -> format () à la place du résumé date ()

Les faits favorables de date_create('now')->format('Y-m-d H:i:s')plus date('Y-m-d H:i:s')sont:

  • plus facile à gérer les manipulations de temps
  • plus facile à gérer les fuseaux horaires
  • oop

Les inconvénients de date_create () -> format () à la place de date ()

La fonction date()a une performance légèrement meilleure que date_create()->format(). Voir test de référence ci-dessous.

$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

Les majuscules montrent que date()c'est plus rapide. Cependant, si nous modifions un peu le scénario de test, le résultat sera différent. Voir ci-dessous:

$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

La méthode DateTime: format()est plus rapide ici que date().




Les avantages de date_create () -> format () au lieu de date () détaillés

Lisez la suite pour l'explication détaillée.

plus facile à gérer les manipulations de temps

date_create()accepte un format de date / heure relatif (comme now, yesterdayou +1 day) voir ce lien , exemple:

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

date() accepte également un format de date / heure relatif, comme ceci:

$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

plus facile à gérer les fuseaux horaires

Lorsque les fuseaux horaires sont importants, l'utilisation de date_create()->format()a beaucoup plus de sens que date()parce qu'il date()utilise le fuseau horaire par défaut configuré dans php.inila date.timezonedirective. Lien: http://php.net/manual/en/datetime.configuration.php#ini.date.timezone .

Il est possible de modifier le fuseau horaire pendant l'exécution. Exemple:

date_default_timezone_set('Asia/Tokyo');.

L'inconvénient est que cela affectera toutes les fonctions de date / heure. Ce problème n'existe pas si vous utilisez date_create()->format()en combinaison avec timezone_open().

PHP prend en charge les principaux fuseaux horaires. Le plus drôle, c'est qu'il supporte même le cercle arctique et l'Antarctique. En avez-vous déjà entendu parler Longyearbyen? Sinon, ne vous inquiétez pas, moi non plus jusqu'à ce que je lise la documentation PHP officielle.

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

Consultez la liste de tous les fuseaux horaires pris en charge: http://php.net/manual/en/timezones.php .

oop

La POO utilise des objets à état complet. Je préfère donc penser de cette façon:

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

Alors penser de cette façon:

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

Par conséquent, je dirais que l' date_create()->format()approche est alors plus lisible pour moi date().




date_create () VS new DateTime ()

Les faits favorables de date_create()plus new DateTime()sont:

  • Espaces de noms

Espaces de noms

Si vous travaillez dans un espace de noms et que vous souhaitez initialiser un objet DateTime avec le nouveau mot-clé, vous devez le faire comme ceci:

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

Il n'y a rien de mal à cela, mais l'inconvénient de ce qui précède est que les gens oublient sporadiquement la contre-oblique. En utilisant ledate_create() fonction constructeur, vous n'avez pas à vous soucier des espaces de noms.

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




Exemple de date_create () -> format ()

J'utilise cette approche pour mes projets si je dois remplir un tableau. Comme ça:

$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'),
);
julien
la source
18

Je cherchais la même réponse, et j'ai trouvé cette solution pour PHP 5.3 ou version ultérieure:

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

La fonction MySQL NOW()renvoie l'horodatage actuel. Le seul moyen que j'ai trouvé pour PHP est d'utiliser le code suivant.

$curr_timestamp = date('Y-m-d H:i:s');
Shriganesh Shintre
la source
16

Une autre réponse que je trouve facile à utiliser:

echo date('c');

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

Il s'agit de la date ISO 8601 (ajoutée en PHP 5) que MySQL utilise

Éditer

MySQL 5.7 n'autorise pas le fuseau horaire dans le datetime par défaut. Vous pouvez désactiver l'erreur avec SQL_MODE=ALLOW_INVALID_DATES. Voir la réponse ici pour plus de détails: https://stackoverflow.com/a/35944059/2103434 .Mais cela signifie également que le fuseau horaire sera perdu lors de l'enregistrement dans la base de données!

Par défaut, MySQL utilise le fuseau horaire du système, et tant que PHP utilise le même fuseau horaire vous devriez être d'accord. Dans mon cas, CET / UTC + 2.

Cela signifie que si j'insère 2015-07-27T00:00:00+02:00dans la base de données, seul 2015-07-27T00:00:00sera stocké (mais c'est l'heure locale correcte!).

Quand je charge le temps en PHP,

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

il supposera automatiquement qu'il s'agit du +02:00fuseau horaire car il s'agit de la valeur par défaut. L'impression sera à nouveau correcte:

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

Pour être sûr, utilisez toujours UTC sur le serveur, spécifiez-le dans MySQL et PHP, puis convertissez-le uniquement aux paramètres régionaux de votre utilisateur lors de l'affichage de la date:

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
Richard87
la source
15

Utilisation strftime:

strftime("%F %T");
  • %Fest le même que %Y-%m-%d.

  • %Test le même que %H:%M:%S.

Voici une démo sur ideone.

Danny Beckett
la source
11

Ou vous pouvez utiliser des DateTimeconstantes :

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

En voici la liste:

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

Pour le débogage, je préfère une version plus courte ( 3v4l.org ):

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

J'aime la solution publiée par user1786647, et je l'ai mise à jour un peu pour changer le fuseau horaire en argument de fonction et ajouter une prise en charge facultative pour passer soit une heure Unix soit une chaîne datetime à utiliser pour l'estampille renvoyée.

Il inclut également une solution de rechange pour "setTimestamp" pour les utilisateurs exécutant une version inférieure à 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");
}
Seth
la source
6

Vous pouvez utiliser la fonction de date PHP avec le format correct comme paramètre,

echo date("Y-m-d H:i:s");
Som
la source
1

Il n'y a pas de now()fonction PHP intégrée, mais vous pouvez le faire en utilisant date().

Exemple

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

Vous pouvez utiliser date_default_timezone_set()si vous devez modifier le fuseau horaire.

Sinon, vous pouvez utiliser Carbon - Une simple extension API PHP pour DateTime.

RAZIUL
la source
0

Si vous voulez avoir du temps maintenant, y compris AM / PM

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

Il sort 2020-05-01 05:45:28 pm

ou

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

Il sort 2020-05-01 05:45:28 PM

Joseph
la source
-1

prochainement

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

php advanced now class extra addMinute addYear as such addHour etc ...

<?php /** @noinspection PhpUnhandledExceptionInspection */

/**
 * Class Now
 * @author  dılo sürücü <[email protected]>
 */
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();

}




en utilisant

  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
dılo sürücü
la source
Pourquoi quelqu'un aurait-il besoin d'une classe entière pour quelque chose qui peut être complètement satisfait en une seule ligne de code?!? Si quelque chose dans ce TLDR a de la valeur, c'est la bonne réponse à la mauvaise question.
mickmackusa
parce que maintenant c'est un objet à chaque fois
dılo sürücü
L'OP n'a demandé qu'une chaîne de date formatée spécifique. Rien de plus. Aucune manipulation de date / heure. C'est la bonne réponse à la mauvaise question.
mickmackusa
ı code répété répéter regardez le code ...
dılo sürücü
Votre modification a copié la solution suggérée à partir de 3 des 5 meilleures réponses sur cette page. Vous contribuez au gonflement des pages (contenu redondant et conseils hors de portée) et ce n'est pas bon pour Stackoverflow.
mickmackusa