Manipuler le temps

Classe Time de Ruby

La classe Time de Ruby permet de créer et de manipuler des dates.

Pour Ruby, une date indique le nombre de seconde depuis le 01/01/1970 à 00:00 en Angleterre(UTC), aussi appelé timestamp.

L'utilisation de Time permet de créer un objet Time correspondant à un moment bien précis dans l'espace temps, qui pourra être utiliser ou manipuler par l'utilisateur, lors de comparaison par exemple.

Afficher une date

Fonctions

Descriptions

Time.now(ou Time.new)

Permet d'obtenir une date actuelle en se basant sur la date du système, les informations locales sont prises en compte.

Time.at(<timestamp>)

Permet de retourner le timestamp en un objet Time, les informations locales sont prises en compte.

Exemple : Time.at(1380517900) retournera <2013-09-30 09:11:40 +0400>

Time.new(<AAAA>,<MM>,<JJ>,<hh>,<mm>,<ss>)

Permet de créer une date avec les informations locales ou avec un offset* donné.

Exemple : Time.new(2013,9,30,12,30,45) retournera <2013-09-30 12:30:45 +0400> UTC

Truc & astuce

*Offset : L'offset se présente de la forme [+-]HH:MM, il indique le nombre d'heures et minutes de décalage par rapport à l'heure UTC. Attention le décalage prend en compte le fuseau horaire et le passage à l'heure d'été (ex : 2013-09-30 12:30:45 +0400)

ProcédureManipuler des dates

Toutes les dates retournées sont des objets Time, ce qui permet à l'utilisateur de les manipuler facilement.

Il est donc possible de modifier son affichage, et même de modifier sa date.

Mais ce qui est surtout utile dans son utilisation au sein de Sentinelle3, c'est la possibilité de comparer différentes dates dans les expressions, lors de la création d'un filtre, d'une vue ou d'une notification.

  1. Modifier une date

    Pour modifier une date, nous utiliserons la syntaxe :

    <Objet Time> - / + <options>, par exemple un Time.now - 2.days, retournera la date actuelle moins 2 jours.

    Les options disponibles sont les suivants :

    Options

    Utilisations

    .year(s)

    Pour l'année

    .month(s)

    Pour le mois

    .day(s)

    Pour le jour

    .hour(s)

    Pour l'heure

    .minute(s)

    Pour la minute

    .second(s)

    Pour la seconde

  2. Comparer deux dates

    Pour comparer deux dates, nous utiliserons les opérateurs de comparaisons (cf Opérateurs et opérandes).

    Lors de la comparaison, le résultat retourné sera soit 'true' qui signifie que notre comparaison est vraie, ou soit 'false' lorsque celle-ci est fausse.

    Dans le cas de deux dates, cela permettra de créer des filtres, des vues, des notifications, qui aidera à la surveillance de systèmes utilisant des dates (date de redémarrage, date d'expiration, etc)

    Sentinelle3 comporte des fonctions qui permettent de retourner des informations en timestamp, tel que :since et :updated (cf Expressions complexes),qui pourront être transformer en objet Time grâce à la fonction Time.at.

    La syntaxe utilisée pour comparer deux dates est la suivante :

    <Objet Time><opérateurs de comparaisons><Objet Time>, exemple Time.at(1381215629) < Time.now

  3. Cas d'utilisation

    Notre besoin

    Nous souhaitons être alerter lorsqu'il reste moins d'un mois avant l'expiration d'un certificat.

    Pour cela, nous créerons une notification, qui enverra un mail, lorsque

    Les composantes à notre disposition

    Nous disposons d'une composante qui remonte l'information souhaitée :

    Icône

    Tag complet de la composante

    Description

    {infosetabs.infosetabs.batch_checkCertifs}

    Informe de la date d'expiration du certificat (en timestamp)

    Construction de notre expression

    Nous savons que Time.now, nous retourne la date actuelle et que Time.at() converti notre timestamp en objet en temps.

    Ce que nous souhaitons, c'est que lorsqu'il reste moins d'un mois avant l'expiration du certificat, c'est à dire Time.at({infosetabs.infosetabs.batch_checkCertifs}.to_i) - 1.month, une notification sera envoyée.

    Pour cela, nous allons comparer nos deux objets Time. Construisons d'abord notre expression en langage commun, ce qui nous donnera :

    Si la date d'expiration moins un mois estinférieur ou égale à la date actuelle, nous aurons une notification.

    En utilisant remplacant les termes, nous obtenons :

    (Time.at({infosetabs.batch_checkCertifs}.to_i) - 1.month <= Time.now)

    Attention

    Il faut obligatoirement utiliser le '.to_i' pour convertir la chaîne de caractères en nombre, pour qu'elle puisse être interpréter par le Time.at()