20 décembre 2021
publié par 

Le format des dateheures d'un Active Directory est de la forme suivante. Cette valeur correspond au nombre de dixième de microsecondes depuis le 1° Janvier 1601.

 

Il faut donc utiliser les propriétés des dates et des heures. Voici le code WLanguage :

 

 

Procedure LDAPEntierVersDateHeure(nDateHeure est un entier sans signe sur 8 octets) :DateHeure
nTemp est un entier
// Date de référence. : 16/01/01 à 00 h 00 m 00 s et 000 ms
dhDateRef est une DateHeure ="16010101000000000"
// On divise le nombre de diziéme de micro-seconde par 10000 pour obtenu des millisecondes
nDateHeure = nDateHeure/10 000

// On affecte la durée en découpant par morceaux

// Millisecondes
nTemp = Modulo(nDateHeure,1000)
dhDateRef.Milliseconde= nTemp
nDateHeure = (nDateHeure - nTemp)/1000

// Secondes
nTemp = Modulo(nDateHeure,60)
dhDateRef.Seconde = nTemp
nDateHeure = (nDateHeure - nTemp)/60

// Minutes
nTemp = Modulo(nDateHeure,60)
dhDateRef.Minute = nTemp
nDateHeure = (nDateHeure - nTemp)/60

// Heures
nTemp = Modulo(nDateHeure,24)
dhDateRef.Heure = nTemp
nDateHeure = (nDateHeure - nTemp)/24

// Jours
dhDateRef.Jour += nDateHeure

// Il manque la conversion en heure locale.
RENVOYER DateHeureUTCVersLocale(dhDateRef)

 

Une autre solution existe, c'est une formule basée sur des constantes. Elle est plus simple mais malheureusement elle ne gère pas les millisecondes.

 

 

Procedure LDAPEntierVersDateHeure(nDateHeure est un entier sans signe sur 8 octets) :DateHeure
n1, n2 sont des entiers sans signe sur 8 octets
n1 = 10000000
n2 = 11644473600
x est une DateHeure = EpochVersDateHeure(nDateHeure / n1 - n2)

RENVOYER x

 

< Retour

1 commentaire

Moh2s
29/02/2024 - 17:07 - Répondre
Bonjour, Merci beaucoup! Avez-vous une fonction pour faire l'opération inverse en vue de mettre à jour une date d'expiration? Merci

Publier un commentaire : 
Votre adresse email ne sera pas publiée