Maison >développement back-end >tutoriel php >Travailler avec les dates et les temps dans PHP et MySQL
La gestion des dates et des temps dans tout langage de programmation est souvent une tâche simple et triviale jusqu'à ce que le fuseau horaire doit être pris en charge. Heureusement, PHP possède un ensemble puissant d'outils de date / temps qui peuvent vous aider à faire face à divers problèmes liés au temps: les horodatages UNIX, les dates de format pour la lecture humaine, les dates d'affichage avec les fuseaux horaires, calculent le décalage horaire d'ici le deuxième mardi du mois prochain, et plus encore. Cet article présentera les bases des fonctions temporelles de PHP (time()
, mktime()
, et date()
) et de leurs homologues orientés objet, puis apprenez les dates de MySQL et vous montrent comment les faire fonctionner parfaitement avec PHP.
gains principaux
time()
, mktime()
et date()
. DateTime
et DateTimeZone
pour les opérations de date et d'heure orientées objet, y compris la gestion de différents fuseaux horaires. Fonction de date et d'heure PHP
La plupart de cet article utilisera Unix Time, également connu sous le nom de temps POSIX ou de temps d'époque. Le temps est exprimé comme le nombre de secondes écoulé depuis minuit UTC le 1er janvier 1970. Si vous êtes intéressé par l'historique complet d'Unix Time, consultez l'article Unix Time sur Wikipedia. L'UTC (temps universel coordonné), également connu sous le nom de GMT, est le temps de la ligne de longitude à 0 degrés. Tous les autres fuseaux horaires du monde sont représentés comme des compensations positives ou négatives par rapport à cette époque. L'utilisation du temps UTC et UNIX pour traiter le temps vous facilitera la vie lorsque vous devez traiter les fuseaux horaires. Je vais y entrer en détail plus tard, mais pour l'instant, ignorons le problème du fuseau horaire et regardons des fonctions de temps.
Obtenez le temps Unix actuel
time()
n'accepte aucun paramètre et renvoie le nombre de secondes depuis l'époque Unix. Pour illustrer cela, j'utiliserai la coque CLI interactive PHP.
<code class="language-bash">sean@beerhaus:~$ php -a php > print time(); 1324402770</code>
Si vous avez besoin d'une représentation de tableau d'Unix Time, utilisez la fonction getdate()
. Il accepte un paramètre d'horodatage UNIX facultatif, mais par défaut une valeur de time()
s'il n'est pas fourni.
<code class="language-php">php > $unixTime = time(); php > print_r(getdate($unixTime)); Array ( [seconds] => 48 [minutes] => 54 [hours] => 12 [mday] => 20 [wday] => 2 [mon] => 12 [year] => 2011 [yday] => 353 [weekday] => Tuesday [month] => December [0] => 1324403688 )</code>
Format Unix Time
Le temps UNIX peut être facilement formaté pour n'importe quelle chaîne que les humains souhaitent lire. date()
est utilisé pour formater les horodatages UNIX en chaînes lisibles par l'homme et accepter un paramètre de format et un paramètre de temps facultatif. Si aucun horodatage facultatif n'est fourni, la valeur de time()
est utilisée.
<code class="language-bash">sean@beerhaus:~$ php -a php > print time(); 1324402770</code>
"R" La chaîne de format renvoie le temps de formatage spécifié par RFC 2822. Bien sûr, vous pouvez utiliser d'autres spécificateurs pour définir votre propre format personnalisé.
<code class="language-php">php > $unixTime = time(); php > print_r(getdate($unixTime)); Array ( [seconds] => 48 [minutes] => 54 [hours] => 12 [mday] => 20 [wday] => 2 [mon] => 12 [year] => 2011 [yday] => 353 [weekday] => Tuesday [month] => December [0] => 1324403688 )</code>
Voir la page de date()
dans la documentation PHP pour une liste complète de caractères formatés acceptables. Cependant, lorsqu'il est utilisé en conjonction avec les fonctions mktime()
et strtotime()
, la fonction devient plus utile, comme vous le verrez dans les exemples suivants.
Créer un temps UNIX en fonction d'un temps donné
mktime()
est utilisé pour créer des horodatages UNIX basés sur une liste de valeurs (secondes, minutes, heures, années, etc.) correspondant à chaque partie de la date. Il accepte de nombreux paramètres entiers, définissant chaque partie de la date dans l'ordre suivant:
<code class="language-php">php > print date("r", $unixTime); Tue, 20 Dec 2011 12:54:48 -0500</code>
Définir isDST
sur 1 si le temps de sauvegarde est activé;
<code class="language-php">php > print date("m/d/y h:i:s a", $unixTime); 12/20/11 12:54:48 pm php > print date("m/d/y h:i:s a"); 12/20/11 01:12:11 pm php > print date("jS of F Y", $unixTime); 20th of December 2011</code>
Vous pouvez voir que mktime()
est très utile lors de la gestion des requêtes de base de données à l'aide de plages de date définies par l'utilisateur. Par exemple, si vous stockez des horodatages en tant qu'entiers (temps Unix) dans MySQL (préfigure n'importe qui?), Il est facile de définir une gamme de requêtes de l'année courante.
<code>mktime(hour, minute, second, month, day, year, isDST)</code>
Résoudre les dates anglaises à Unix Time
Fonction presque magique strtotime()
prend une chaîne au format de date / temps comme premier argument, et un horodatage Unix utilisé comme base de conversion. Veuillez vous référer à la documentation pour les formats de date acceptables.
<code class="language-php">php > print date("r", mktime(12, 0, 0, 1, 20, 1987)); Tue, 20 Jan 1987 12:00:00 -0500 php > print date("r", mktime(0, 0, 0, date("n"), date("j"), date("Y"))); Tue, 20 Dec 2011 00:00:00 -0500 php > print date("r", mktime(23, 59, 59, date("n"), date("j"), date("Y"))); Tue, 20 Dec 2011 23:59:59 -0500</code>
Les objets DateTime et DateTimeZone de PHP
L'objet PHP DateTime
est une méthode orientée objet qui gère les dates et les fuseaux horaires. Le constructeur accepte une représentation de chaîne du temps, très similaire à ce qui précède strtotime()
, que certaines personnes peuvent trouver plus facile à utiliser. Si aucun paramètre n'est fourni, la valeur par défaut est "maintenant".
<code class="language-php"><?php $startTime = mktime(0, 0, 0, 1, 1, date("y")); $endTime = mktime(0, 0, 0, date("m"), date("d"), date("y"));</code>La méthode
DateTime
de format()
fonctionne de la même manière que la fonction date()
ci-dessus et accepte tous les mêmes caractères formatés. L'objet DateTime
est également livré avec des constantes utiles qui peuvent être alimentées à la méthode format()
.
<code class="language-php">php > print strtotime("now"); 1324407707 php > print date("r", strtotime("now")); Tue, 20 Dec 2011 14:01:51 -0500 php > print strtotime("+1 week"); 1325012569 php > print date("r", strtotime("+1 week")); Tue, 27 Dec 2011 14:03:03 -0500 php > print date("r", strtotime("next month")); Fri, 20 Jan 2012 14:04:20 -0500 php > print date("r", strtotime("next month", mktime(0, 0, 0))); Fri, 20 Jan 2012 00:00:00 -0500 php > print date("r", strtotime("next month", mktime(0, 0, 0, 1, 31))); Thu, 03 Mar 2011 00:00:00 -0500</code>
La liste complète des constantes peut être trouvée sur la page DateTime
Document. Étant donné que nous traiterons bientôt du fuseau horaire, fournissons un fuseau horaire par défaut pour PHP. Dans votre fichier de configuration php.ini (j'en ai un pour CLI et un pour Apache), trouvez la section comme indiqué ci-dessous:
<code class="language-php">php > $dt = new DateTime("now"); php > print $dt->format("r"); Tue, 20 Dec 2011 16:28:32 -0500 php > $dt = new DateTime("December 31 1999 12:12:12 EST"); php > print $dt->format("r"); Fri, 31 Dec 1999 12:12:12 -0500</code>
Lorsqu'aucune valeur n'est attribuée à date.timezone
, PHP fera de son mieux pour déterminer le fuseau horaire du système réglé sur le serveur. Vous pouvez utiliser date_default_timezone_get()
pour vérifier quelle valeur PHP utilise.
<code class="language-bash">sean@beerhaus:~$ php -a php > print time(); 1324402770</code>
Définissons le fuseau horaire du serveur sur UTC Time (date.timezone = UTC
) et enregistrons le fichier de configuration. Vous devez redémarrer Apache ou Shell CLI pour afficher les modifications. L'objet PHP DateTime
comprend une instance de classe DateTimeZone
interne pour suivre le fuseau horaire. Lorsque vous créez une nouvelle instance de DateTime
, l'interne DateTimeZone
doit être défini sur la valeur par défaut fournie dans php.ini.
<code class="language-php">php > $unixTime = time(); php > print_r(getdate($unixTime)); Array ( [seconds] => 48 [minutes] => 54 [hours] => 12 [mday] => 20 [wday] => 2 [mon] => 12 [year] => 2011 [yday] => 353 [weekday] => Tuesday [month] => December [0] => 1324403688 )</code>
La liste complète des noms de fuseau horaire acceptables peut être trouvée sur la page du document de fuseau horaire. Vous pouvez maintenant voir la différence de temps où deux objets DateTime
reçoivent des fuseaux horaires différents. Par exemple, voici un exemple de conversion de l'UTC en America / New_york (EST).
<code class="language-php">php > print date("r", $unixTime); Tue, 20 Dec 2011 12:54:48 -0500</code>
Veuillez noter le décalage -0500 en décembre. Si vous modifiez la valeur du temps à une date d'été, comme le 1er juillet, vous constaterez qu'il connaît l'heure d'été (EDT).
<code class="language-php">php > print date("m/d/y h:i:s a", $unixTime); 12/20/11 12:54:48 pm php > print date("m/d/y h:i:s a"); 12/20/11 01:12:11 pm php > print date("jS of F Y", $unixTime); 20th of December 2011</code>
Utilisez des dates avec MySQL et PHP
Si vous avez utilisé MySQL à n'importe quel niveau, vous avez peut-être remarqué le type DateTime qui fonctionne hors de la boîte. Il ressemble et sent un rendez-vous, et si vous dites que c'est une date, vous avez raison. Cependant, une fois que vous l'avez sélectionné parmi MySQL dans PHP, tout ce que vous avez est une chaîne qui ressemble à une date. Il n'a pas de conscience de fuseau horaire et est formaté pour un usage humain avant que les humains ne doivent le voir. Oui, je sais que MySQL a beaucoup de fonctions de formatage de date, mais nous utilisons déjà PHP, et comme vous pouvez le voir, PHP est excellent dans les formats de date de traitement. Pourquoi devons-nous également le formater directement à partir de la base de données? Nous devrons peut-être appliquer différentes conversions et formats. Il est préférable de formater la date que lorsque les humains sont sur le point de le voir.
<code>mktime(hour, minute, second, month, day, year, isDST)</code>
Exécutez ce script simple et vous pouvez voir que tout ce que vous obtenez à partir du champ DateTime est une chaîne formatée sans aucune information de fuseau horaire.
<code class="language-php">php > print date("r", mktime(12, 0, 0, 1, 20, 1987)); Tue, 20 Jan 1987 12:00:00 -0500 php > print date("r", mktime(0, 0, 0, date("n"), date("j"), date("Y"))); Tue, 20 Dec 2011 00:00:00 -0500 php > print date("r", mktime(23, 59, 59, date("n"), date("j"), date("Y"))); Tue, 20 Dec 2011 23:59:59 -0500</code>
La valeur DateTime est l'heure locale du serveur exécutant MySQL, quel que soit le fuseau horaire de ce serveur. Si tout ce que vous faites implique un seul serveur dans un fuseau horaire, alors DateTime peut convenir à la plupart de vos besoins, et je vous envoie très envie. Alors, comment puis-je utiliser PHP et MySQL pour gérer les dates et les fuseaux horaires? Stockez les dates en tant qu'horodatrices UNIX. Vous savez déjà que Unix Time est le nombre de secondes depuis UTC le 1er janvier 1970, donc cela vous donne un fuseau horaire constant, et vous avez peut-être remarqué que de nombreuses fonctions de date / temps de PHP sont basées sur des horodatages UNIX. Lorsque je utilise MySQL, je crée généralement une colonne de table qui stocke les dates comme entier non signé. Lors de l'insertion d'une date, vous pouvez utiliser PHP time()
ou MySQL UNIX_TIMESTAMP()
.
<code class="language-php"><?php $startTime = mktime(0, 0, 0, 1, 1, date("y")); $endTime = mktime(0, 0, 0, date("m"), date("d"), date("y"));</code>
Si vous voulez que MySQL forme des dates, vous pouvez le faire. Mais le temps sera dans le fuseau horaire du serveur exécutant MySQL, et je vous recommande de ne pas faire de formatage avant d'atteindre le niveau de modèle / vue de votre application Web et d'être prêt à le voir.
<code class="language-bash">sean@beerhaus:~$ php -a php > print time(); 1324402770</code>
Dans toute application qui s'étend sur les fuseaux horaires, vous avez généralement une table qui suit les paramètres de fuseau horaire personnalisés de l'utilisateur, puis le lit dans la valeur $_SESSION
. Supposons que vous ayez une entrée de session comme indiqué ci-dessous:
<code class="language-php">php > $unixTime = time(); php > print_r(getdate($unixTime)); Array ( [seconds] => 48 [minutes] => 54 [hours] => 12 [mday] => 20 [wday] => 2 [mon] => 12 [year] => 2011 [yday] => 353 [weekday] => Tuesday [month] => December [0] => 1324403688 )</code>
Vous pouvez facilement convertir les temps UNIX stockés (en UTC) en n'importe quelle date dans le fuseau horaire d'un utilisateur spécifique.
<code class="language-php">php > print date("r", $unixTime); Tue, 20 Dec 2011 12:54:48 -0500</code>
Cela entraînera la date "Lun, 16 janvier 2012 12:03:49 -0600". -0600 vous indique qu'il est à 6 heures derrière UTC et que le décalage de l'UTC est 0. Si nous définissons le fuseau horaire sur America / Los_Angeles, la date générée sera:
<code class="language-php">php > print date("m/d/y h:i:s a", $unixTime); 12/20/11 12:54:48 pm php > print date("m/d/y h:i:s a"); 12/20/11 01:12:11 pm php > print date("jS of F Y", $unixTime); 20th of December 2011</code>
et America / New_york générera:
<code>mktime(hour, minute, second, month, day, year, isDST)</code>
Résumé
Les dates de gestion et les fuseaux horaires font partie de la vie quotidienne de nombreux programmeurs, mais il n'est pas nécessaire de vous inquiéter lorsque vous pouvez utiliser la bibliothèque de dattes puissante et facile à utiliser de PHP. Vous avez appris à obtenir des horodatages Unix, comment formater les dates dans n'importe quel format imaginable, comment analyser la représentation anglaise des dates dans les horodatages, comment ajouter une période de temps aux horodatages et comment convertir entre les fuseaux horaires. S'il y a deux points principaux dans cet article, il est 1) de s'en tenir au temps UNIX, et 2) de s'en tenir à l'UTC comme fuseau horaire de base pour toutes les dates lors de l'utilisation de PHP et MySQL. L'idée de tous les temps basée sur UTC n'est pas seulement applicable à PHP et MySQL; Si vous vous retrouvez à travailler dans une autre langue, il y a de fortes chances que vous vous disiez: "Merde, pourquoi ne peuvent-ils pas faire de même que PHP?"
Images de Yakobchuk Vasyl / Shutterstock
(La section FAQ doit être ajoutée ici sur la section FAQ pour gérer les dates et les heures de PHP, similaire à la section FAQ dans le texte d'entrée. Je ne l'ai pas ajouté ici en raison des limitations de l'espace.)
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!