|
Site |
Cours VB.net |
|
|
|
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 SubPrivate 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:
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..
Il est exclu de faire des boucles vides:
For i=0 to 100000 ' le temps écoulé est variable en fonction des machines..
Next i
Autre méthode : on boucle tant que l'heure courante est inférieure à l'heure du départ+3s
Dim t As DateTime=DateTime.Now
Do While DateTime.Now <t.AddSeconds(3)
Loop
Mais cela accapare le processeur.
On peut utiliser un Timer et vérifier dans la procédure Tick si le temps est écoulé (avec les restrictions que l'on connait).
On peut utiliser Thread.Sleep (qui met le processus en cours en sommeil).
System.Threading.Thread.Sleep(3000)
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.
|
|
|
|
|