Le timestamp UNIX et la date en PHP

Dans cette nouvelle partie, nous allons nous intéresser aux dates et aux fonctions PHP qui vont nous permettre de les manipuler.

Avant tout, nous allons définir ce qu’est le Timestamp UNIX et comprendre son intérêt.

 

Le Timestamp UNIX

Le format Timestamp UNIX est un format de mesure de date très utilisé en programmation. Le Timestamp UNIX représente le nombre de secondes écoulées depuis le 1er janvier 1970 à minuit (heure GMT) et jusqu’à une date donnée.

Ce format de date est difficile à manier pour un humain mais comme le Timestamp UNIX est un nombre on va très facilement pouvoir le manipuler en PHP et l’utiliser pour par exemple comparer deux dates.

Un autre intérêt majeur du Timestamp est qu’il va être le même pour un moment donné quel que soit le fuseau horaire puisque ce nombre représente le nombre de secondes écoulées depuis un point précis dans le temps. Cela va s’avérer très pratique lorsqu’on aura besoin de représenter le temps pour l’ensemble de la planète d’un coup.

Notez finalement que le PHP met bien évidemment à notre disposition certaines fonctions qui vont nous permettre d’exprimer une date sous un format dont on a l’habitude (jour-mois-année par exemple) à partir d’un Timestamp.

 

Obtenir un Timestamp et le Timestamp actuel en PHP

Obtenir le Timestamp relatif à la date actuelle en PHP

Pour obtenir le Timestamp actuel en PHP, c’est-à-dire le nombre de secondes écoulées entre le 1er janvier 1970 à minuit GMT et le moment actuel, nous allons utiliser la fonction time().

<!DOCTYPE html>
<html>
    <head>
        <title>Cours PHP & MySQL</title>
        <meta charset="utf-8">
        <link rel="stylesheet" href="cours.css">
    </head>
    
    <body>
        <h1>Titre principal</h1>
        <?php
            echo 'Timestamp actuel : ' .time(). '<br>';
        ?>
        <p>Un paragraphe</p>
    </body>
</html>

 

Récupérer le timestamp courant en PHP avec la fonction time

Si vous testez ce code chez vous, il est tout à fait normal que vous n’ayez pas les mêmes valeurs que moi puisque nous n’exécutons pas le code au même moment et donc qu’un nombre différent de secondes se sont écoulées depuis le 1er janvier 1970 pour vous et moi.

Obtenir le Timestamp d’une date donnée en PHP

Pour obtenir le Timestamp UNIX lié à une date donnée, nous allons pouvoir utiliser la fonction mktime() qui retourne le Timestamp UNIX d’une date ou la fonction gmmktime() qui retourne le Timestamp UNIX d’une date GMT.

Ces deux fonctions vont s’utiliser de la même façon. Nous allons pouvoir leur passer une série de nombres en arguments. Ces nombres vont constituer une date et vont représenter (dans l’ordre) les parties suivantes de la date dont on souhaite obtenir le Timestamp :

  1. L’heure ;
  2. Les minutes ;
  3. Les secondes ;
  4. Le jour ;
  5. Le mois ;
  6. L’année.

Les arguments sont tous facultatifs et si certains sont omis ce sera la valeur courante ou actuelle de la date qui sera utilisée et donc le Timestamp actuel qui sera renvoyé. Attention cependant : lorsque des arguments sont omis, la fonction considère que ce sont les derniers car elle n’a aucun moyen de savoir quel argument est omis.

Ainsi, il est impossible d’omettre juste le jour par exemple puisque dans ce cas la fonction considérerait que la valeur du mois correspond au jour et celle de l’année au mois. Pour omettre l’argument « jour », il faudra également omettre le mois et l’année.

<!DOCTYPE html>
<html>
    <head>
        <title>Cours PHP & MySQL</title>
        <meta charset="utf-8">
        <link rel="stylesheet" href="cours.css">
    </head>
    
    <body>
        <h1>Titre principal</h1>
         <?php
            echo 'Timestamp actuel : ' .time(). '<br>';
            echo 'Timestamp actuel (avec mktime()) : '.mktime(). '<br>';
            $t1 = mktime(8, 30, 0, 1, 25, 2019);
            $gmt1 = gmmktime(8, 30, 0, 1, 25, 2019);
            echo 'Timestamp 25 janvier 2019 08h30 (GMT+1) : ' .$t1. '<br>';
            echo 'Timestamp 25 janvier 2019 08h30 (GMT) : ' .$gmt1. '<br>';
        ?>
        <p>Un paragraphe</p>
    </body>
</html>

 

Exemple d'utilisation des fonctions mktime gmmktime en PHP

Lorsqu’on travaille avec les dates, la chose la plus difficile à comprendre est généralement la façon dont vont être gérés les fuseaux horaires.

Ici, la fonction mktime() calcule le Timestamp d’une date donnée en fonction du fuseau horaire du serveur. Pour moi, en France et en hiver, je suis à GMT+1. Quand il est 8h30 chez moi, il est donc 7h30 sur un fuseau GMT. La fonction va donc transformer mon heure en heure GMT et se baser sur 7h30 pour calculer le Timestamp.

La fonction gmmktime(), en revanche, considère que l’heure passée est une heure GMT. Cette fonction va donc calculer le Timestamp de l’heure exacte donnée. C’est la raison pour laquelle j’ai un écart de 3600 secondes entre mes deux Timestamps renvoyées par mktime() et gmmktime() : car ces deux Timestamps ne représentent pas la même date.

Obtenir un Timestamp à partir d’une chaine de caractères

Finalement, nous allons également pouvoir obtenir un Timestamp à partir d’une chaine de caractères en utilisant la fonction strtotime() qui transforme une chaine de caractères de format date ou temps en Timestamp.

Pour que cette fonction fonctionne correctement, il va falloir lui passer une chaine de caractères en argument sous un format qu’elle comprend. Notez déjà que cette fonction se base sur le fuseau horaire de votre serveur.

Il y a de nombreuses façons d’écrire une date en PHP. Si vous souhaitez connaitre la liste complète, je vous invite à aller sur la documentation officielle ici : http://php.net/manual/fr/datetime.formats.php.

Les dates littérales devront bien évidemment toujours être écrites en anglais puisque l’anglais est la langue prise comme standard en développement informatique. Les formats de date les plus courants acceptés sont les suivants :

  • mm/dd/y (mois/jour/année). Ex : 1/25/19, 1/25/2019 ;
  • y-mm-dd (anné-mois-jour). Ex : 19-01-25, 2019-01-25 ;
  • dd-mm-yy (jour-mois-année). Ex : 25-01-2019 ;
  • dd-mois y (jour-mois textuel année). Ex : 25-January 2019 ;
  • mois dd, y (mois textuel jour, année). Ex : January 25, 2019 ;

On va ensuite pouvoir ajouter à ces dates un temps qu’on va également pouvoir préciser sous différents formats. Le format de loin le plus utilisé pour les temps est le format heures:minutes:secondes comme par exemple 12:30:15.

Notez que la fonction strtotime() va également accepter des formats de date relatifs comme :

  • Le nom d’un jour (« sunday », « monday », etc.) ;
  • Une notation basée sur le jour comme yesterday (hier à minuit), today (aujourd’hui à minuit), now (maintenant), tomorrow (demain à minuit), etc ;
  • Une notation ordinale comme « first fri of January 2019 » (premier vendredi de janvier en 2019) ;
  • Une notation avec « ago » comme « 2 days ago » (avant-hier) ou « 3 months 2 days ago » (il y a trois mois et deux jours) ;
  • Une notation avec des « + » et des « – » comme « +1 day » (demain) ou « – 3 weeks » (il y a 3 semaines).

Nous allons de plus pouvoir combiner ces formats de dates ensemble en respectant certaines règles pour créer des formats de dates complexes. Dans ce cours, nous allons cependant nous contenter de manipuler des dates simples car elles vont se révéler suffisantes dans l’immense majorité des cas.

<!DOCTYPE html>
<html>
    <head>
        <title>Cours PHP & MySQL</title>
        <meta charset="utf-8">
        <link rel="stylesheet" href="cours.css">
    </head>
    
    <body>
        <h1>Titre principal</h1>
        <?php
            echo 'Timestamp actuel : ' .time(). '<br>';
            $t1 = mktime(8, 30, 0, 1, 25, 2019);
            $gmt1 = gmmktime(8, 30, 0, 1, 25, 2019);
            echo 'Timestamp 25 janvier 2019 08h30 (GMT+1) : ' .$t1. '<br>';
            echo 'Timestamp 25 janvier 2019 08h30 (GMT) : ' .$gmt1. '<br>';
            
            $stt1 = strtotime('2019/01/25 08:30:00');
            $stt2 = strtotime('2019/01/25');
            $stt3 = strtotime('next friday');
            $stt4 = strtotime('2 days ago');
            $stt5 = strtotime('+1 day');
            
            echo 'Timestamp 25 janvier 2019 08h30 (GMT+1) : ' .$stt1. '<br>';
            echo 'Timestamp 25 janvier 2019 minuit (GMT+1) : ' .$stt2. '<br>';
            echo 'Timestamp vendredi 1 février minuit (GMT+1) : ' .$stt3. '<br>';
            echo 'Timestamp il y a 48h : ' .$stt4. '<br>';
            echo 'Timestamp dans 24h : ' .$stt5;
        ?>
        <p>Un paragraphe</p>
    </body>
</html>

 

Exemple d'utilisation de la fonction strtotime en PHP

 

Obtenir une date à partir d’un Timestamp en PHP

Pour obtenir une date en PHP, on va pouvoir utiliser la fonction getdate().

Cette fonction va accepter un Timestamp en argument et retourner un tableau associatif contenant les différentes informations relatives à la date liée au Timestamp.

Si aucun argument n’est passé à getdate(), alors la fonction utilisera le Timestamp relatif à la date courante et retournera donc la date actuelle locale.

Le tableau associatif renvoyé par getdate() est de la forme suivante :

ClefValeur associée
secondsLes secondes
minutesLes minutes
hoursL’heure
mdayLe numéro du jour dans le mois
wdayLe numéro du jour de la semaine (dimanche = 0, lundi = 1, samedi = 6 pour nous)
monLe numéro du mois (de 1 à 12)
yearL’année complète
ydayLe jour de l’année (1er janvier = 0, 2 janvier = 1, etc.)
weekdayLe jour de la semaine sous forme de texte (en anglais)
monthLe mois de l’année écrit en toutes lettres (en anglais)
0Le Timestamp relative à la date renvoyée
<!DOCTYPE html>
<html>
    <head>
        <title>Cours PHP & MySQL</title>
        <meta charset="utf-8">
        <link rel="stylesheet" href="cours.css">
    </head>
    
    <body>
        <h1>Titre principal</h1>
        <?php
            echo 'Timestamp actuel : ' .time(). '<br>';

            $stt = strtotime('2019-01-25');
            echo 'Timestamp 25 janvier 2019 minuit (GMT+1) : ' .$stt. '<br>';
            
            echo '<pre>';
            print_r(getdate());
            echo '</pre><br>';
            
            echo '<pre>';
            print_r(getdate($stt));
            echo '</pre>';
        ?>
        <p>Un paragraphe</p>
    </body>
</html>

 

Utilisation de la fonction getdate en PHP et récupération d'une timestamp

Laisser un commentaire