OVH Cloud OVH Cloud

Anomalie temporelle.

1 réponse
Avatar
Michel Walsh
Bonjour,


On sait qu'une valeur date et heure est emmagazinée comme un nombre à
virgule flottante, avec la portion fractionnaire qui décrit le temps. La
partie entière décrit le nombre de jours depuis de 30 décembre 1899. Si ce
choix semble suspect, la légende veut qu'initialement, on a désiré avoir le
jour 1 comme le premier janvier 1900, mais s'étant fourvoyé, ayant cru que
1900 était bisextile alors qu'elle ne l'est pas, on a reculé l'origine de 1
jour de plus, ce qui n'affectait pas les dates postérieures au premier mars
1900.

Mais l'anomalie que je tiens à signaler n'est pas sur la date, mais sur
la portion heure. En effet, .125, en VBA, représente toujours 03:00:00,
quelque soit son signe! En effet, ouvrez MS Word, faire Alt-F11 pour entrer
dans VBE, et, dans la fenêtre d'exécution immédiate (Ctrl-G si requis),
faire:

? Format(0, "yyyy.mm.dd hh:nn:ss")
1899.12.30 00:00:00
? Format(0+0.125, "yyyy.mm.dd hh:nn:ss")
1899.12.30 03:00:00
? Format(0-0.125, "yyyy.mm.dd hh:nn:ss")
1899.12.30 03:00:00


On se rend compte que -.125 et +.125 produisent exactement le même instant
dans le temps, date_et_heure. Cette anomalie vient perturber un grand nombre
d'opérations sur les dates représentées par un nombre négatif. En effet,
même si le nombre est négatif, la portion fractionnaire doit toujours être
lue comme si elle était positive.


? Format( -222.125, "yyyy.mm.dd hh:nn:ss")
1899.05.22 03:00:00


soit, .125 implique 03:00:00, que le nombre soit positif, ou négatif. Une
fois qu'on s'est habitué à ce concept pour le moins surprenant, on peut
ainsi expliquer d'autres anomalies. Ainsi, si au jour qui correspond au
nombre -12345, à minuit, j'ajoute, arithmétiquement, 0.00001, soit environ
une seconde (une seconde =.= un dix-millième de jour) :

? -12345 + 0.00001
-12344.99999

eh bien, si j'interprète ce nombre en tant que date et heure, je me retrouve
à 23:59:59. le jour qui suit. Donc, en ajoutant, arithmétiquement, un
dix-millième, j'ai, de fait, pratiquement ajouté DEUX jours ! Confirmation
par expérimentation:


? Format( -12345, "yyyy.mm.dd hh:nn:ss" )
1866.03.13 00:00:00
? Format( -12345 +0.00001, "yyyy.mm.dd hh:nn:ss" )
1866.03.14 23:59:59


Si on croyait ajouter une seconde, on est surpris, ou on devrait l'être...

Il faut donc éviter d'utiliser l'arithmétique en point flottant sur des
dates et heures d'avant le 30 décembre 1899, à moins de savoir ce qu'on
fait, effectivement. Il est fortement conceillé d'utiliser DateAdd et
fonctions prédéfinies, si on prévoit avoir à travailler avec de telles
dates, car elles fournissent les résultats escomptés:

? DateAdd("s", 1, CDate("1866-03-13"))
1866-03-13 00:00:01


Espérant que ce petit exposé a su vous divertir,
Vanderghast, Access MVP

1 réponse

Avatar
Pierre CFI
bonjour
Impressionnant ta démo :Oo>

--
Pierre CFI
MVP Microsoft Access

Site pour bien commencer
http://users.skynet.be/mpfa/
Site perso
http://access.cfi.free.fr
"Michel Walsh" a écrit dans le message de news:
Bonjour,


On sait qu'une valeur date et heure est emmagazinée comme un nombre à
virgule flottante, avec la portion fractionnaire qui décrit le temps. La
partie entière décrit le nombre de jours depuis de 30 décembre 1899. Si ce
choix semble suspect, la légende veut qu'initialement, on a désiré avoir le
jour 1 comme le premier janvier 1900, mais s'étant fourvoyé, ayant cru que
1900 était bisextile alors qu'elle ne l'est pas, on a reculé l'origine de 1
jour de plus, ce qui n'affectait pas les dates postérieures au premier mars
1900.

Mais l'anomalie que je tiens à signaler n'est pas sur la date, mais sur
la portion heure. En effet, .125, en VBA, représente toujours 03:00:00,
quelque soit son signe! En effet, ouvrez MS Word, faire Alt-F11 pour entrer
dans VBE, et, dans la fenêtre d'exécution immédiate (Ctrl-G si requis),
faire:

? Format(0, "yyyy.mm.dd hh:nn:ss")
1899.12.30 00:00:00
? Format(0+0.125, "yyyy.mm.dd hh:nn:ss")
1899.12.30 03:00:00
? Format(0-0.125, "yyyy.mm.dd hh:nn:ss")
1899.12.30 03:00:00


On se rend compte que -.125 et +.125 produisent exactement le même instant
dans le temps, date_et_heure. Cette anomalie vient perturber un grand nombre
d'opérations sur les dates représentées par un nombre négatif. En effet,
même si le nombre est négatif, la portion fractionnaire doit toujours être
lue comme si elle était positive.


? Format( -222.125, "yyyy.mm.dd hh:nn:ss")
1899.05.22 03:00:00


soit, .125 implique 03:00:00, que le nombre soit positif, ou négatif. Une
fois qu'on s'est habitué à ce concept pour le moins surprenant, on peut
ainsi expliquer d'autres anomalies. Ainsi, si au jour qui correspond au
nombre -12345, à minuit, j'ajoute, arithmétiquement, 0.00001, soit environ
une seconde (une seconde =.= un dix-millième de jour) :

? -12345 + 0.00001
-12344.99999

eh bien, si j'interprète ce nombre en tant que date et heure, je me retrouve
à 23:59:59. le jour qui suit. Donc, en ajoutant, arithmétiquement, un
dix-millième, j'ai, de fait, pratiquement ajouté DEUX jours ! Confirmation
par expérimentation:


? Format( -12345, "yyyy.mm.dd hh:nn:ss" )
1866.03.13 00:00:00
? Format( -12345 +0.00001, "yyyy.mm.dd hh:nn:ss" )
1866.03.14 23:59:59


Si on croyait ajouter une seconde, on est surpris, ou on devrait l'être...

Il faut donc éviter d'utiliser l'arithmétique en point flottant sur des
dates et heures d'avant le 30 décembre 1899, à moins de savoir ce qu'on
fait, effectivement. Il est fortement conceillé d'utiliser DateAdd et
fonctions prédéfinies, si on prévoit avoir à travailler avec de telles
dates, car elles fournissent les résultats escomptés:

? DateAdd("s", 1, CDate("1866-03-13"))
1866-03-13 00:00:01


Espérant que ce petit exposé a su vous divertir,
Vanderghast, Access MVP