Site:  Cours VB.net  
4.5 Travailler sur le temps: dates, heure, Timers.

        

On a vu qu'il existe un type de variable 'DateTime' pour gérer les dates et heures, comment l'utiliser ?

Nous verrons aussi comment utiliser les Timers pour déclencher des évènements à intervalle régulier,

Enfin comment perdre du temps?

 

Une variable DateTime      Contient une date plus l’heure.

                            Elle occupe 8 octets.(64 bits)

Elle peut contenir une date comprise entre le 1er janvier de l'année 1 et le 31 décembre 9999 et une heure comprise entre 0:00:00 (minuit) et 23:59:59.

En fait ce qui est codé dans la variable DateTime est le nombre de graduations ( Une graduation= 100 nanosecondes.) écoulées à compter de minuit, le 1er janvier de l'année 1  jusqu'a la date codée.

Nb: DateTime fait partie d'une Classe .Net , il existe aussi un type nommé Date qui fait partie de Visual Basic, qui n'est pas une classe donc, mais qui est équivalent à DateTime.

Donc DateTime est équivalent à Date.

 

Définir une date, une heure

A - Pour définir une  valeur DateTime en utilisant un littéral: elle doit être placée entre des signes (#) et son format doit être de type d/m/yyyy, par exemple #31/5/1998#.

Dim  dateNaissance As DateTime

dateNaissance= #02/12/1951#

B - Autre manière de saisir une date, une heure:

Dim dateNaissance As New System.DateTime(1996, 6, 3, 22, 15, 0)   

'Année, mois, jour, heure, minute, seconde, et éventuellement millisecondes)

Ici on a utilisé le constructeur.

C -Troisième méthode:

On peut saisir une date dans une string puis convertir:

DateNaissance = CDate("02/12/1951")

CDate converti donc une chaîne en dateTime. On peut aussi utiliser Ctype:
 

Dim dateNaissance As Date = Ctype("01/12/2005", Date)

 

 

IsDate (objet) permet de vérifier si objet est convertible en date.

IsDate retourne True si l'expression est de type Date ou est une chaîne convertible en type Date ; sinon, elle retourne False.

Cela permet de vérifier, après une saisie d'une string par exemple, si l'utilisateur a bien tapé des chiffres valides et même si la date est valide ("31/02/1945" n'est pas valide).

Bizarrerie= "12/2005" est considéré comme une date valide et équivalente à "01/12/2005"!! Pas de vérification des  2 '/'.

If IsDate( MyString) Then..

Exemple de Microsoft:

Dim MyDate, YourDate As DateTime
Dim NoDate As String
Dim D As Boolean
MyDate = CDate("12 Février, 1969")
YourDate = #2/12/1969#
NoDate = "Hello"
D = IsDate(MyDate)
' Retourne True.
D = IsDate(YourDate)
' Retourne True.
D = IsDate(NoDate)
' Retourne False.
 

Afficher une date, une heure.

Pour afficher les dates et heures simplement, il suffit d'utiliser .ToString

MsgBox(DateNaissance.ToString)    'Affichera  02/12/1951 11:00:00

C'est le format utilisé par l'ordinateur (en fonction du pays)

ToString peut comporter des arguments qui formatent l'affichage:

Voici quelques codes de formatage:

d        affiche le jour                           2

dd       affiche le jour sur 2 chiffres            02

ddd      affiche le jour abrégé                    Dim.

dddd     affiche le jour complet                   Dimanche

M        affiche le mois                           12

MM       affiche le mois sur 2 chiffres            12

MMM      affiche le mois abrégé                    déc

MMMM     affiche le mois complet                   décembre

y, yy, yyyy affiche 1 à 2 chiffres, deux chiffres ou quatre chiffre     51, 51, 1951

H      affiche l'heure  sur un ou deux chiffres (format 24h)

HH     affiche l'heure sur 2 chiffres

h et hh font de même mais avec un format 12 h.

t, tt  affiche l'heure en format 12h  plus A ou P (pour matin, après midi)

m, mm, s, ss, f, ff font de même pour les minutes, secondes et millisecondes.

: et / sont les séparateurs heure et date.

Exemple:

MsgBox(DateNaissance.ToString("dddd d MMMM yyyy"))    'Affichera  Dimanche 2 décembre 1951

MsgBox(DateNaissance.ToString("hh:mm")    'Affichera  11:00

MsgBox(DateNaissance.ToString("d/MM/yy")    'Affichera  02/12/51

MsgBox(DateNaissance.ToString("%h)    'Affichera  11   le caractère % est utilisé quand on affiche une seule donnée.

On peut enfin utiliser les méthodes de la classe DateTime!!

DateNaissance.ToLongDateString        'dimanche 02 décembre 1951

DateNaissance.ToShortDateString       '02/12/1951

DateNaissance.ToLongTimeString        '11:00:00

DateNaissance.ToShortTimeString       '11:00

 

Variable "temps"

Un TimeSpan est une unité de temps (un intervalle de temps) exprimée en jours, heures, minutes, secondes;

Un TimeSpan  initialisé avec 1.0e+13 graduations représente "11.13:46:40", ce qui correspond à 11 jours, 13 heures, 46 minutes et 40 secondes.

L'espace de nom System.DateTime. contient une multitude de membre:

Add, Substrat

On peut ajouter ou soustraire un TimeSpan à un DateTime, on obtient un DateTime.

En clair on peut ajouter à une date une durée, on obtient une date.

' Quel sera la date  dans 36 jours?.
Dim today As System.DateTime
Dim duration As System.TimeSpan
Dim answer As System.DateTime

today = System.DateTime.Now
duration = New System.TimeSpan(36, 0, 0, 0)
answer = today.Add(duration)

On peut ajouter ou soustraire 2 dates, on obtient une TimeSpan

Dim diff1 As System.TimeSpan
diff1 = date2.Subtract(date1)

 

AddDay, AddMouths, AddHours, AddSeconds, AddMiliseconds

Permet d'ajouter des jours, des mois, des  heures, des secondes, ou des  millisecondes à une date, on obtient une date.

Answer=today.AddDay(36)
 

Year, Mouth, Day, Hour, Minute, Seconde, Millisecond

Permettent d'extraire l'année, le mois, le jour, l'heure, les minutes, les secondes, les millisecondes d'une date:

I=DateNaissance.Year    ' => I=1951

I=System.DateTime.Now.Day    'donne le jour d'aujourd'hui (1 à 31)

 

(DatePart permet aussi d'extraire plein d'infirmations d'une date: jour , mois, année, jour de la semaine..)

DayOfWeek

Retourne le jour de la semaine (0 pour dimanche à 6 pour samedi)

I=DateNaissance.DayOfWeek    'I=0  car le 02/12/1951 est un dimanche.

DayForYear existe aussi.

Now, ToDay, TimeOfDay

Now est la date et l'heure du système.(Là, maintenant)

ToDay est la date du système avec l'heure à 0.

TimeOfDay est l'heure actuelle.

En Clock permet de récupérer l’heure courante ainsi que le nombre de millisecondes écoulées depuis le démarrage.

MsgBox(My.Computer.Clock.LocalTime.ToString) 'Affiche date et heure

 

 

Ticks

Donne le nombre de graduations d'un DateTime.

AddTicks peut être utilisé.

Année bissextile?

Pour cela utiliser IsLeapYear:

MsgBox(DateTime.IsLeapYear(2005)) 'Affiche False

 

Comparaison de DateTime

On utilise Compare: DateTime.Compare(t1, t2) retourne 0 si t1=t2, une valeur positive si t1>t2 négative si t1<t2.

Dim t1 As New DateTime(100)
Dim t2 As New DateTime(20)

If DateTime.Compare(t1, t2) > 0 Then
    Console.WriteLine("t1 > t2")
End If
If DateTime.Compare(t1, t2) = 0 Then
    Console.WriteLine("t1 = t2")
End If
If DateTime.Compare(t1, t2) < 0 Then
    Console.WriteLine("t1 < t2")
End If

 

On peut aussi utiliser la méthode op_Equality de l'espace de nom pour voir si 2 dates sont égales:

areEqual = System.DateTime.op_Equality(april19, otherDate)
 

Il existe aussi op_GreaterThan et beaucoup d'autres.

Calcul de la différence entre 2 dates

On utilise DateDiff, il faut fournir en paramètre:

DateInterval.Day pour obtenir le nombre de jours entre les 2 dates.

DateInterval.Year pour obtenir le nombre d'années entre les 2 dates.

..

Exemple:

Afficher le nombre de jours entre une date donnée et la date du jour.
 

Dim DateS, Msg As String ' Declare les  variables.
Dim DateD As DateTime
DateS = InputBox("Entrer une date")
'Saisir une date : on récupère une string
DateD = CDate(DateS)               
'Conversion de la string en DateTime
Msg = "Nombre de jour:"& DateDiff(DateInterval.Day, Now, DateD)
'différence en jours
MsgBox (Msg)

 

Comment saisir rapidement une date dans un programme?

En ajoutant à une fenêtre un contrôle DateTimePicker

En mode Run , il apparaît une zone rectangulaire avec la date système dedans:

 

Si l'utilisateur clique sur la flèche déroulante, il apparaît une fenêtre calendrier.

Il suffit pour l'utilisateur de cliquer sur la bonne date.

Le programmeur récupère la date dans   DateTimePicker1.value

Il existe, bien sur, de multiples propriétés et plusieurs évènements, le plus remarquable étant: ValueChanged.

 

MonthCalendar est un contrôle similaire mais qui reste toujours ouvert.

De plus grâce à CalendarDimension on peut afficher plusieurs mois.

 

Les Timers.

 

Pour déclencher un évènement à intervalle régulier, il faut utiliser les minuteries ou 'Timer'.

Prendre le contrôle Timer  dans la Boite à outils, l'ajouter à la  fenêtre. Il apparaît en bas sous la fenêtre dans la barre d'état des composants.

Il n'apparaît pas à l'utilisateur dans la fenêtre en mode Run.

Il est très simple à utiliser.

La propriété Interval  contient la périodicité de l'événement Ticks , évènement qui se déclenche régulièrement.

Interval est en  millisecondes. Pour Interval=500  l'évènement Ticks se déclenche toutes les 1/2 secondes.

Start et Stop déclenche et arrête la minuterie. (De même Enabled active ou non )

Exemple:

Faire clignoter un label toutes les 1/2 secondes.

Créer le label1

Ajouter un Timer1 (qui se place en bas sous la fenêtre)

Private Sub Form3_Load(...)

    Timer1.Interval = 500

    Timer1.Start()

End Sub

 

Private Sub Timer1_Tick(..)

    Label1.Visible = Not (Label1.Visible)

End Sub

 

Un évènement Timer_Tick se produit toutes les 1/2 secondes  et inverse la valeur de la propriété visible du label. (Si elle était égale à  True, elle devient égale à False et vice versa.)

 

Mais attention: Timer à des restrictions de taille:

Donc pour faire clignoter un label :OUI

Pour compter précisément un intervalle de temps:NON

Mais il y a d'autres méthodes.

 

Perdre du temps:

Parfois on a besoin de perdre du temps:

Exemple ne rien faire pendant 3 secondes puis poursuivre..

For i=0 to 100000    ' le temps écoulé est variable en fonction des machines..

Next i

Dim t As DateTime=DateTime.Now

Do While DateTime.Now <t.AddSeconds(3)

Loop

Mais cela accapare le processeur.

    Le temps de sommeil du thread est en millisecondes: 3000 correspond à 3 secondes.

 

Chronométrer:

Parfois on a besoin de chronométrer un évènement:

Voir la rubrique Chronométrer 7-4

L'exemple sur l'horloge est aussi didactique.