• [supprimé]

Bonjour,

En Informatique on peut être amené à coder des dates. Le but est de les transformer en valeurs uniques de types entiers permettant des comparaisons rapides. Il est plus facile de faire une soustraction sur un entier que de manipuler le jour le mois et l'année pour y parvenir.

Une version assez simple pour le codage décodage peut être ainsi :

// déclaration globale à la classe

unsigned int dval ;

// transformation de l'entier dval en year, mounth, day

void parse_val( unsigned int & y, unsigned int & m , unsigned int & d )

{

y = ( dval >> 9 );

m = ( ( dval >> 5) & 15 ) ;

d = ( dval & 31 ) ;

}

// compacte année mois jour en entier dval

inline unsigned int pack_val( unsigned int y, unsigned int m , unsigned int d )

{

return d + (m << 5) + ( y << 9 ) ;

}

Ca marche mais il y a un problème. Par exemple si la date est 1990-01-01 on obtiendra une clé dval de valeur par exemple 3456666. Si on ajoute 1 jour on aura 3456667 soit +1. Par contre si on passe au mois suivant ou à l'année suivante il va y avoir une rupture dans la contiguité de la clé (dval). Certes c'est jouable tant que le veut pas faire de comparaisons ou de calcul d'intervalles. De plus on ne peut pas agir directement sur la clé puisque la contiguité ne respecte un pas d'incrémentation et de décrémentation unitaire.

Il existe donc une solution qui réalise l'exploit de coder de manière contigue toutes les dates valides. Une fois une date ainsi codée on peut agir directement sur la clé pour avancer ou reculer dans le temps. Mais cette solution est très difficile à mettre en oeuvre, je l'ai cueillie d'un autre programme et testé. Ainsi je vous la présente pour simple curiosité.

void parse_val( unsigned int & y, unsigned int & m, unsigned int & d )

{

unsigned int d1;

unsigned int j1 = dval - 1721119L;

y = (unsigned int) (( ( j1 << 2) - 1) / 146097L);

j1 = ( j1 << 2 ) - 1 - 146097L * y;

d1 = ( j1 >> 2) ;

j1 = ( ( d1 << 2 ) + 3) / 1461;

d1 = ( d1 << 2 ) + 3 - 1461 * j1;

d1 = ( d1 + 4 ) >> 2;

m = (unsigned int) (5 * d1 - 3) / 153;

d1 = 5 * d1 - 3 - 153 * m;

d = (unsigned int)((d1 + 5)/5);

y = (unsigned int)(100 * y + j1);

if( m < 10 ) m += 3;

else

{

m -= 9;

++y;

}

}

unsigned int pack_val( unsigned int y, unsigned int m , unsigned int d )

{

unsigned int c, ya;

if( y <= 99 ) y += 1900;

if( m > 2 ) m -= 3; else { m += 9; y--; }

c = y / 100;

ya = y - 100 * c;

return ( (146097L * c ) >> 2 ) + ((1461 * ya) >> 2 ) + (153 * m + 2) / 5 + d + 1721119L ;

}

Comme on peut voir c'est assez élaboré, celui qui a fait cette implémentation a vraiment cerné le problème. On peut toutefois par ce mécanisme remonter dans le temps mais cela risque de ne plus avoir de sens si on obtient des dates antérieures au temps Grégorien. Je serais curieux de savoir comment on arrive à de tels calculs ?

Cordialement.

Intéressant.

Ca me fait penser à la fonction excel dateval, avec laquelle il n'y a pas de rupture dans l'incrémentation numérique renvoyée d'une date au format texte. Sans quoi elle ne servirait pas à grand chose.

exemple:

31/01/2015=42035

01/02/2015=42036

31/12/2015=42369

01/01/2016=42370

Comme quoi cela se suit bien.

Sans pouvoir analyser ta fonction (je ne suis pas compétent là dedans), fonctionne t-elle aussi bien que DATEVAL ?

Pourrait t-on pomper le code de cette fonction microsoft, afin de la copier dans le sien ?

Si oui, zenon va t-il être emprisonné pour décryptage frauduleux de code propriété de microsoft ?

  • [supprimé]

Intéressant.

Ca me fait penser à la fonction excel dateval, avec laquelle il n'y a pas de rupture dans l'incrémentation numérique renvoyée d'une date au format texte. Sans quoi elle ne servirait pas à grand chose.

exemple:

31/01/2015=42035

01/02/2015=42036

31/12/2015=42369

01/01/2016=42370

Comme quoi cela se suit bien.

Sans pouvoir analyser ta fonction (je ne suis pas compétent là dedans), fonctionne t-elle aussi bien que DATEVAL ?

Pourrait t-on pomper le code de cette fonction microsoft, afin de la copier dans le sien ?

Si oui, zenon va t-il être emprisonné pour décryptage frauduleux de code propriété de microsoft ?

Bonjour,

Cela fonction aussi bien que la fonction de Microsoft et ce n'est pas la propriété de Microsoft. On peut à partir de cette fonction trouver aisément une solution pour des valeurs qui ajoutent l'heure à la date. L'heure calculée en secondes pour l'instant sans les micro-secondes, cela donne un temps en secondes

// dval la date codée

// tval représente l'heure en secondes

// 86400 le nombre de secondes dans 1 jour

unsigned long key() const

{

return ( dval * 86400UL ) + tval ;

}

Cela tient largement sur un entier signé 64 voir 32 bits pour un vaste intervalle de temps. L'ennui est qu'il faut prévoir le cas des dates négatives c'est à dire avant Jésus Christ sachant que le calendrier occidental n'est pas contigu à cause du temps Grégorien.

Cordialement.

  • [supprimé]

Intéressant.

Ca me fait penser à la fonction excel dateval, avec laquelle il n'y a pas de rupture dans l'incrémentation numérique renvoyée d'une date au format texte. Sans quoi elle ne servirait pas à grand chose.

exemple:

31/01/2015=42035

01/02/2015=42036

31/12/2015=42369

01/01/2016=42370

Comme quoi cela se suit bien.

Sans pouvoir analyser ta fonction (je ne suis pas compétent là dedans), fonctionne t-elle aussi bien que DATEVAL ?

Pourrait t-on pomper le code de cette fonction microsoft, afin de la copier dans le sien ?

Si oui, zenon va t-il être emprisonné pour décryptage frauduleux de code propriété de microsoft ?

Bonjour,

Cela fonction aussi bien que la fonction de Microsoft et ce n'est pas la propriété de Microsoft. On peut à partir de cette fonction trouver aisément une solution pour des valeurs qui ajoutent l'heure à la date. L'heure calculée en secondes pour l'instant sans les micro-secondes, cela donne un temps en secondes

// dval la date codée

// tval représente l'heure en secondes

// 86400 le nombre de secondes dans 1 jour

unsigned long key() const

{

return ( dval * 86400UL ) + tval ;

}

Cela tient largement sur un entier signé 64 voir 32 bits pour un vaste intervalle de temps. L'ennui est qu'il faut prévoir le cas des dates négatives c'est à dire avant Jésus Christ sachant que le calendrier occidental n'est pas contigu à cause du temps Grégorien.

Pour le calcul que j'ai cité sur la date la référence n'est pas Microsoft mais :

/ Convert a Julian day number to its corresponding Gregorian calendar

// date. Algorithm 199 from Communications of the ACM, Volume 6, No. 8,

// (Aug. 1963), p. 444. Gregorian calendar started on Sep. 14, 1752.

// This function not valid before that.

Cordialement.

J'en profite zenon pour vous poser deux questions bêtes, alors accrochez vous:

// questions de st louis

- avec quel éditeur de programme peut on faire un copier/coller de cette fonction et la faire fonctionner ?

- comment se nomme le langage ?

end sub

Car il me manque dans mes programmes un tout simple genre freeware (sous w7/64b) pour tenter de bricoler quelques lignes.

Et peut être découvrir en moi un programmeur refoulé !

Moi je me demande comment on fait pour utiliser ces programmes lorsqu'on rentre la date du "18 brumaire an 12" pour savoir combien y a de jours jusqu'à aujourd'hui... :?

Moi je me demande comment on fait pour utiliser ces programmes lorsqu'on rentre la date du "18 brumaire an 12" pour savoir combien y a de jours jusqu'à aujourd'hui... :?

Il y a une correspondance avec les dates classique voyons ! Bien sûr si tu rentres la date en calendrier révolutionnaire, ça va buguer.

D'où un nouveau programme à écrire pour zenon. :

Moi je me demande comment on fait pour utiliser ces programmes lorsqu'on rentre la date du "18 brumaire an 12" pour savoir combien y a de jours jusqu'à aujourd'hui... :?

Il y a une correspondance avec les dates classique voyons ! Bien sûr si tu rentres la date en calendrier révolutionnaire, ça va buguer.

D'où un nouveau programme à écrire pour zenon. :Il était pas mal quand même ce calendrier révolutionnaire... 8-)

tous les mois avaient 30 jours...

Personnellement, j'aurais plutôt opté pour 13 mois de quatre semaines de sept jours mais bon, peut être que c'était trop féminin pour l'époque. :?

Avec tous les quatre ans, 5 jours de congés pour tout le monde...(ce "calendrier frelon" est idéal quand on a plusieurs maîtresses pour se souvenir du jour des règles de chacune de ses nanas 8-) )

Moi je me demande comment on fait pour utiliser ces programmes lorsqu'on rentre la date du "18 brumaire an 12" pour savoir combien y a de jours jusqu'à aujourd'hui... :?

Il y a une correspondance avec les dates classique voyons ! Bien sûr si tu rentres la date en calendrier révolutionnaire, ça va buguer.

D'où un nouveau programme à écrire pour zenon. :En fait, ma petite remarque était là pour montrer que le problème de "zenon" avec les dates antérieures à JC, était un faux problème...

si déjà, son programme fonctionne jusqu'en 1850 c'est Byzance... 8-)

Je ne crois pas qu'on aie très souvent besoin de manipuler des dates antérieures...

super cette fonction excel...

Je viens de faire un tableau pour ce soir avec le nombre de jours de tous les convives... ainsi que la somme des ages du ou des patriarches vis avis de la somme des ages de tous ses enfants et en comparaison de ceux de tous ses petits enfants.

Bref, le patriarche est lessivé en comparaison de l'expérience de vie de tous ses enfants, par contre, il pèse encore un peu par rapport à celle de tous ses petits enfants!

Je ne sais pas si c'est normal... En tous cas, ça devrait changer très très vite! vu qu'il en a 6...

PS... je me demande si la démocratie ne devrait pas elle aussi tenir compte de ce phénomène?

  • [supprimé]

J'en profite zenon pour vous poser deux questions bêtes, alors accrochez vous:

// questions de st louis

- avec quel éditeur de programme peut on faire un copier/coller de cette fonction et la faire fonctionner ?

- comment se nomme le langage ?

end sub

Car il me manque dans mes programmes un tout simple genre freeware (sous w7/64b) pour tenter de bricoler quelques lignes.

Et peut être découvrir en moi un programmeur refoulé !

Bonjour,

Faîtes un copier-coller de ce que vous voyez sur la page de votre navigateur vers un éditeur de texte sur Windows. Le langage c'est du C++ vous n'avez pas remarqué ? J'ai l'impression que vous allez tenter de la traduire en Visual Basic ?

Cordialement.

  • [supprimé]

Moi je me demande comment on fait pour utiliser ces programmes lorsqu'on rentre la date du "18 brumaire an 12" pour savoir combien y a de jours jusqu'à aujourd'hui... :?

Il y a une correspondance avec les dates classique voyons ! Bien sûr si tu rentres la date en calendrier révolutionnaire, ça va buguer.

D'où un nouveau programme à écrire pour zenon. :En fait, ma petite remarque était là pour montrer que le problème de "zenon" avec les dates antérieures à JC, était un faux problème...

si déjà, son programme fonctionne jusqu'en 1850 c'est Byzance... 8-)

Je ne crois pas qu'on aie très souvent besoin de manipuler des dates antérieures...

Bonjour,

L'usage de dates antérieures à 1752 est très courant pour les historiens, les géologues, les anthropologues ... L'année négative devra subir un traitement spécifique. Car si on transmet une année négative sous forme d'entier long non signé de 32 bits on obtiendra un débordement de capacité soit un truc comme -((2^32) - x) .

Cordialement.

Bon cette fois ci, c'est sûr, "Zebulon" me fait la gueule... :?

  • [supprimé]

Bon cette fois ci, c'est sûr, "Zebulon" me fait la gueule... :?

Bonjour,

Allons, allons joyeux Noël frelon !

Cordialement.

Bonjour,

Faîtes un copier-coller de ce que vous voyez sur la page de votre navigateur vers un éditeur de texte sur Windows. Le langage c'est du C++ vous n'avez pas remarqué ? J'ai l'impression que vous allez tenter de la traduire en Visual Basic ?

Cordialement.

Je connais le C++ seulement de nom, je ne sais pas le reconnaître.

Ma question était quel programme idéal pour faire tourner un code de C++, ça ne va pas s'éxécuter tout seul dans un éditeur de texte j'imagine ! Je vois par exemple, un truc comme Dev C++ en freeware, il doit y en avoir plein, avez vous un conseil là dessus.

Non pas de traduction prévue en visual basic, suis pas assez compétent, un jour j'ai essayé de reprendre des macros qu'on m'avait faite pour excel, mais ça se plantait à chaque ligne ! Quand on part de zéro c'est imbuvable, je n'y pige rien et pourtant je pense avoir un cerveau (en fait deux hémisphères ) !

Je suis intéressé par ça pour passer du temps, me découvrir peut être un nouveau loisir.

  • [supprimé]

Bonjour,

Faîtes un copier-coller de ce que vous voyez sur la page de votre navigateur vers un éditeur de texte sur Windows. Le langage c'est du C++ vous n'avez pas remarqué ? J'ai l'impression que vous allez tenter de la traduire en Visual Basic ?

Cordialement.

Je connais le C++ seulement de nom, je ne sais pas le reconnaître.

Ma question était quel programme idéal pour faire tourner un code de C++, ça ne va pas s'éxécuter tout seul dans un éditeur de texte j'imagine ! Je vois par exemple, un truc comme Dev C++ en freeware, il doit y en avoir plein, avez vous un conseil là dessus.

Non pas de traduction prévue en visual basic, suis pas assez compétent, un jour j'ai essayé de reprendre des macros qu'on m'avait faite pour excel, mais ça se plantait à chaque ligne ! Quand on part de zéro c'est imbuvable, je n'y pige rien et pourtant je pense avoir un cerveau (en fait deux hémisphères ) !

Je suis intéressé par ça pour passer du temps, me découvrir peut être un nouveau loisir.

Bonjour,

Il vous faut un compilateur du C++ sur Windows. Comme cet exemple ne requiert pas les spécificités du dernier C++ ( c++11 ou c++1y ) un compilateur gratuit existe chez Embacadero ex Borland Inprise. Mais je vous conseille un compilateur du C++ venant de MinGw. Vous l'installez pour faire simple dans c:\mingw ensuite dans outils système options avancées de Windows vous mettez c:\mingw dans le PATH de Windows.

une fois votre code source au point dans une console vous le compilez et exécutez. Au plus simple

g++ -O2 -o monexecutable moncodesource.

Cordialement.

Merci frelon & zenon, je pense que d'ici l'année prochaine j'aurais pu faire quelque chose.

12 jours plus tard

Bonjour,

En Informatique on peut être amené à coder des dates.

En informatique on peut aussi utiliser les fonctions existantes et ne pas réinventer la roue tout le temps