Blog ENI : Toute la veille numérique !
🎁 Jusqu'au 31/12, recevez notre
offre d'abonnement à la Bibliothèque Numérique. Cliquez ici
🎁 Jusqu'au 31/12, recevez notre
offre d'abonnement à la Bibliothèque Numérique. Cliquez ici

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 :

images/29RI01.png

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.

images/29RI11.png

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 :

images/29RI12.png

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 :

images/29RI13.png

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 :

images/29RI14.png

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 :

images/29RI24.png

Cela peut nous être utile dans de nombreux cas et scripts :

  • Comparer la date actuelle (date A) avec celle de la dernière...