playlist Introduction à Ruby - La classe Time

Publié il y a plus de 2 ans dans la série : Ruby - Formation complète
Nicolas Cavigneaux
Votre formateur
Nicolas Cavigneaux

A la recherche d'un langage polyvalent, j'ai fait la découverte de Ruby en 2003. J'ai donc très vite commencé à utiliser Ruby au quotidien pour des tâches diverses et variées (scripting, applications lourdes…).

Courant 2004, une vague de fraicheur est apparue avec l'arrivée de Ruby on Rails qui m'a de suite conquis. J'ai donc décidé de participer activement à la communauté (forums, patches, librairies, …). En 2010, je fais la rencontre de Martin Catty et retrouve dans sa vision la rigueur et les bonnes pratiques que j'aime mettre en place, le déclic a donc été immédiat.

Synbioz met en place des solutions robustes sur la base d'outils modernes et funs, je veux faire partie de l'aventure.

Catégories : Développement


Vidéo dédiée à la découverte de la classe Time en ruby. Cette vidéo fait partie d'une série qui a pour but de vous faire découvrir les bases de la programmation en Ruby et des éléments de langage les plus utilisés au quotidien.

Afficher le transcript complet de la vidéo

Bienvenue dans cette vidéo consacrée à la présentation de la classe Time en Ruby.


Pour ce screencast nous utilisons la version 2 de Ruby et nous ferons les démonstrations dans IRB.


La théorie


La manipulation de dates et heures est une nécessité fréquente en programmation. Fort heureusement, en Ruby il est facile de manipuler ce type d’information.


Ruby met à notre disposition la classe Time qui permet de faire la majorité des manipulations inhérentes à ce type de données.


En interne, les objets de la classe Time sont stockés sous forme d’un entier qui représente le nombre de nano-secondes écoulées depuis ce qu’on appelle “Epoch” qui correspond au 1 janvier 1970 à minuit UTC.


Nous verrons dans une prochaine vidéo que les classes Date et DateTime apportent quelques outils supplémentaires qui améliorent la flexibilité.


Création d’objets Time


La chose la plus fondamentale qu’on puisse vouloir faire est de connaître la date et l’heure courante :

Time.new


Nous n’avons pas passé de paramètre à new c’est donc l’heure courante qui nous est retournée. Pour ce cas fréquent, il existe une méthode plus explicite :

Time.now


Il existe plusieurs façon de créer des objets Time. Pour le fuseau horaire local, pour le fuseau horaire UTC et finalement pour un fuseau horaire arbitraire :

Time.local(2015, 8, 12, 8, 15, 20)
Time.utc(2015, 8, 12, 8, 15, 20)
Time.new(2015, 8, 12, 8, 15, 20, "-05:00")


Les paramètres à passer vont de celui ayant la plus grande unité, l’année, à celui ayant la plus petite, la seconde. Seul l’année est un paramètre obligatoire :

Time.local(2015, 8, 12, 8)
Time.local(2015, 8, 12)


Si vous tentez de créer une date invalide, disons avec un mois qui n’existe pas, vous auriez une exception ArgumentError qui serait levée :

Time.local(2015, 13)


Affichage des objets Time


De nombreuses méthodes sont mises à notre disposition pour manipuler ces dates :

t = Time.local(2015, 8, 12, 8, 15, 20)
t.to_s


to_s nous retourne une version textuel de la date facilement compréhensible par un humain mais également simple à analyser avec un programme.


Il est également possible de formater la représentation à votre guise grâce à la méthode strftime :

t.strftime("Printed on %d/%m/%Y")
t.strftime("at %H:%M")  


Les options de formatage sont très complètes et je vous invite à lire la documentation de strftime pour en avoir une liste exhaustive.


On peut par exemple utiliser le formatage suivant pour des dates compatibles ISO 8601 pour nos JSON :

t.strftime("%FT%R")


Les méthodes utilitaires


La classe Time nous livre aussi une panoplie de méthodes qui nous permettent de savoir si une instance correspond à un jour donné :

t.monday?
t.tuesday?
t.wednesday?
t.thursday?
t.friday?
t.saturday?
t.sunday?


Nous avons aussi quelques méthodes qui nous permettent de récupérer le jour, le mois etc :

t.day
t.month
t.year
t.hour
t.min
t.sec
t.usec


On peut également connaître le jour dans l’année que représente notre instance :

t.yday


Les fuseaux horaire


Nous avons également de quoi manipuler les fuseaux horaire. Quel est le fuseau horaire ?`

t.zone


Est-ce que c’est une heure d’été ?

t.dst?


Est-ce que c’est une heure UTC ?

t.utc?


Convertir l’heure en heure locale

t.getlocal


Convertir l’heure en heure UTC

t.getutc


Quelle est le nombre de secondes de décalage entre mon heure et l’heure UTC ?

t.utc_offset


Arithmétique


Pour finir, il est également possible de faire de l’arithmétique sur les objets Time :

t1 = Time.now
t2 = t1 + 60


On voit que t2 est exactement une minute plus tard que t1, soit 60 secondes.

t3 = t1 + 120

t1 != t2
t1 < t2

t2 - t1

t2.between?(t1, t3)


Conclusion


La gestion des dates et heures en Ruby est donc quelque chose de très simple grâce à une panoplie de méthodes qui nous facilitent la vie.


Il devient facile d’écrire des méthodes de plus haut niveau pour manipuler de façon avancée ce type de données dans nos programmes. La librairie propose d’ailleurs les extensions Date et DateTime qui apportent encore plus d’aisance dans la manipulation.


D’autres librairies comme ActiveSupport vont encore plus loin et ajoutent encore plus de naturel dans la manipulation des dates.