La gestion des dates
Introduction
Lors de l’écriture de scripts PowerShell, il se peut parfois que nous ayons besoin d’utiliser des dates pour :
-
l’écriture de logs pour indiquer ce que fait votre script, à quelle date et à quelle heure.
-
vérifier la date d’un élément, convertir une date en un élément compréhensible ou alors comparer deux dates afin d’établir un intervalle, puis exécuter un bloc d’instructions précises si cet intervalle est supérieur ou inférieur à une valeur numérique donnée.
Cmdlet Get-Date
PowerShell offre une cmdlet très complète pour manipuler les dates. Cette cmdlet se nomme Get-Date et permet d’obtenir la date et heure actuelle. Le résultat retourné est un objet au format DateTime : System.DateTime.
Vous pouvez le remarquer en utilisant la méthode GetType.
(get-date).gettype()
Ci-dessous le résultat :
1. Vérifier l’aide
Nous allons vérifier comment fonctionne cette cmdlet.
Il s’agit d’une bonne pratique à utiliser lors de l’utilisation d’une nouvelle cmdlet afin d’en comprendre son fonctionnement.
Nous utiliserons pour cela la cmdlet Get-Help puis le nom de la cmdlet à analyser, ici Get-Date.
Get-Help Get-Date
Ci-dessous le retour :
PS C:\Users\damien.vanrobaeys> Get-Help Get-Date
NAME
Get-Date
SYNOPSIS
Gets the current date and time.
SYNTAX
Get-Date [[-Date] <System.DateTime>] [-Day <System.Int32>]
[-DisplayHint {Date | Time | DateTime}] [-Format <System.String>]
[-Hour <System.Int32>] [-Millisecond <System.Int32>]
[-Minute <System.Int32>] [-Month <System.Int32>] [-Second
<System.Int32>] [-Year <System.Int32>] [<CommonParameters>]
Get-Date [[-Date] <System.DateTime>] [-Day <System.Int32>]
[-DisplayHint {Date | Time | DateTime}] [-Hour <System.Int32>]
[-Millisecond <System.Int32>] [-Minute <System.Int32>]
[-Month <System.Int32>] [-Second <System.Int32>] [-UFormat
<System.String>] [-Year <System.Int32>] [<CommonParameters>]
DESCRIPTION
The `Get-Date` cmdlet gets a DateTime object that represents
the current date or a date that you specify. `Get-Date` can format
the date and time in several .NET and UNIX formats. You
can use `Get-Date` to generate a date or time character string,
and then send the string to other cmdlets or programs.
`Get-Date` uses the computer's culture settings to determine
how the output is formatted. To view your computer's settings, ...
Formatage des dates
Choisir le bon format pour une date peut être intéressant pour étoffer vos scripts et plus particulièrement lors de la création de fichiers de log.
Différents formats de date existent, par exemple :
-
09/27/2022
-
27/09/2022
-
Mardi 27 septembre 2022
-
Mardi 27 septembre 2022, 21:30
Le formatage de la date au travers de la cmdlet Get-Date peut s’effectuer facilement en utilisant le paramètre -Format suivi du formatage souhaité.
Get-Date -Format "Formatage souhaité"
1. Formatage simple
Vous trouverez ci-dessous une liste des formats standards disponibles avec un exemple parlant.
Format |
Description |
Exemple |
d |
Date courte |
27/09/2022 |
D |
Date longue |
Mardi, Septembre 27, 2022 |
f |
Date longue et heure courte |
Mardi, Septembre 27, 2022 20:51 |
F |
Date et heure longues |
Mardi, Septembre 27, 2022 20:51:49 |
g |
Date et heure courtes |
9/27/2022 8:52 PM |
G |
Date courte et heure longue |
9/27/2022 8:52:34 PM |
M, m |
Mois et jour |
September 27 |
s |
Date et heure triée |
2022-09-27T20:53:07 |
t |
Heure abrégée |
8:53 PM |
T |
Heure complète |
8:53:26 PM |
u |
Date et heure universelle |
2022-09-27 20:53:35Z |
U |
Date complète |
Tuesday, September 27, 2022 6:53:47 PM |
Y, y |
Année et mois |
September 2022 |
Davantage d’informations sont disponibles sur le site Learn Microsoft, lien ci-dessous : https://learn.microsoft.com/fr-fr/dotnet/standard/base-types/standard-date-and-time-format-strings?redirectedfrom=MSDN
2. Formatage personnalisé
Vous trouverez ci-dessous une liste des formats personnalisés disponibles avec un exemple parlant.
Format |
Description |
Exemple |
d |
Jour du mois, de 1 à 31 |
9/27/2022 |
dd |
Jour du mois, de 01 à 31 |
27 |
ddd |
Jour de la semaine version abrégée |
Tue |
dddd |
Nom complet du jour de la semaine |
Tuesday |
f |
|
Tuesday, September 27, 2022 9:09 PM |
ff |
Centièmes de seconde dans une valeur de date et d’heure |
18 |
fff |
Millisecondes dans une valeur de date et d’heure |
507 |
gg |
Période ou ère |
A.D. |
h |
Heure au format 12 heures, de 1 à 12 |
9 |
hh |
Heure au format 12 heures, de 01 à 12 |
09 |
HH |
Heure, au format de 24 heures, de 00 à 23 |
21 |
m |
Minute, définie entre 0 et 59 |
8 |
mm |
Minute, définie entre 00 et 59 |
08 |
M |
Mois, de 1 à 12 |
9 |
MM |
Mois, de 01 à 12 |
09 |
MMM |
Nom abrégé du mois |
Sep |
MMMM |
Nom complet du mois |
September |
s |
Seconde, de 0 à... |
Conversion de dates
1. Convertir une chaîne de caractères en date
Prenons la chaîne de caractères suivante : 27/09/2022.
Ce texte aura donc comme type String.
Nous pouvons, par exemple, imaginer une date saisie par un utilisateur. Cette date au format string n’est donc pas facilement exploitable, il faudra alors la convertir au format DateTime.
Nous utiliserons pour cela la classe DateTime et la méthode ParseExact.
[Datetime]::ParseExact(Date, Format, $null)
Dans notre exemple, la date est 27/09/2022, le format est donc dd/MM/yyyy.
Ci-dessous la conversion de la date à l’aide de la classe DateTime :
[Datetime]::ParseExact('27/09/2022', 'yy/MM/yyyy', $null)
Ci-dessous le résultat :
Si la date est 09/27/2022, le format sera dd/MM/yyyy et le code :
[Datetime]::ParseExact('09/27/2022', 'yy/MM/yyyy', $null)
Cela peut également s’écrire :
[System.Datetime]::ParseExact('09/27/2022', 'MM/dd/yyyy', $null)
Ci-dessous le résultat :
Nous pouvons également utiliser la classe DateTime sans la méthode ParseExact, comme ci-dessous :
[DateTime]"Date"
ou :
$Date="Date"
[DateTime]$Date
Ci-dessous avec notre date du 27 septembre 2022 :
[DateTime]"9/27/2022"
Ci-dessous le résultat :
2. Convertir une date en chaîne de caractères
Nous allons...
Comparaison de dates
1. Calcul d’intervalle entre deux dates
-
Prenons une date A : 27 septembre 2022
-
Prenons une date B : 09 mars 2020
Convertissons ces deux dates en DateTime avec la méthode ParseExact.
$Date_A = [Datetime]::ParseExact('27/09/2022', 'dd/MM/yyyy', $null)
$Date_B = [Datetime]::ParseExact('09/03/2020', 'dd/MM/yyyy', $null)
Nous souhaitons maintenant comparer les deux dates en affichant le nombre de jours, heures, etc. d’intervalle. Pour cela, rien de plus simple, une soustraction :
$Date_A - $Date_B
Ci-dessous le résultat retourné :
PS C:\Users\damien.vanrobaeys> $Date_A - $Date_B
Days: 932
Hours: 0
Minutes: 0
Seconds: 0
Milliseconds: 0
Ticks: 805248000000000
TotalDays: 932
TotalHours: 22368
TotalMinutes: 1342080
TotalSeconds: 80524800
TotalMilliseconds : 80524800000
Le résultat nous donne donc :
-
le nombre total de jours entre les deux dates : 932 jours
-
les heures en plus des jours : 0 heure
-
les secondes en plus des jours : 0 minute
-
le nombre total d’heures entre les deux dates : 22368 heures
-
le nombre total de minutes entre les deux dates : 1342080 minutes
-
le nombre total de secondes entre les deux dates : 80524800000 secondes
Pour récupérer le nombre de jours seulement, il suffira d’ajouter le calcul dans une variable puis de récupérer la propriété Days.
$Diff = $Date_A - $Date_B
$Diff.days
Ci-dessous le retour :
Cela peut nous être utile dans de nombreux cas et scripts :
-
Comparer la date actuelle (date A) avec celle de la dernière...