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_format
variable.
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
, yesterday
ou +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.ini
la date.timezone
directive. 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
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'),
);