OVH Cloud OVH Cloud

mktime

6 réponses
Avatar
Jacques
Salut à tous,

Soit le code suivant :

----
#include <stdio.h>
#include <time.h>

#define SIZE 256

int main (int argc, char *argv[])
{
time_t td;
struct tm dc;
char buffer[SIZE];

dc.tm_mon = 1; /* Fev */
dc.tm_mday = 16; /* 16 */
dc.tm_year = 64; /* 1964 */
dc.tm_hour = 8; /* 8 h */
dc.tm_min = 0; /* 0 min */
dc.tm_sec = 0; /* 0 sec */
dc.tm_isdst = -1; /* saving time */

td = mktime(&dc);

if (td == -1)
{
printf("Erreur: %ld\n", (long)td);
exit(-1);
}
else {
printf("Date == %s\n", ctime(&td));
strftime (buffer, SIZE, "Today is %A, %B %d.\n", &dc);
}
return 0;
}

Ce code retourne Erreur: -1 pour toute valeur antérieure à 70 dans le
champs dc.tm_year de la struct.

Je sais maintenant que la fonction mktime est limitée à ne gérer que les
dates comprises entre 1/1/70 et 2038.

Ma question: comment (quelles fonctions ou quelles astuces) faire pour
les dates antérieures (pour par exemple retrouver le jour de la semaine,
calculer le nombre de secondes, etc...). Des liens vers des documents
seront suffisants, un bout de code serait un must, mais bon ne vous
prenez pas la tête, c'est juste que je suis assez curieux de savoir.

Merci,

Jacques


--
Non aux brevets logiciels en Europe.

6 réponses

Avatar
Nicolas George
Jacques wrote in message <cvn8n6$9fb$:
Ma question: comment (quelles fonctions ou quelles astuces) faire pour
les dates antérieures (pour par exemple retrouver le jour de la semaine,
calculer le nombre de secondes, etc...).


Eh bien, le calendrier grégorien est assez bien documenté, et il est assez
facile (quoi qu'un peu fastidieux) d'implémenter les fonctions
correspondantes. Les histoires de secondes intercalaires et d'heure locale
sont plus pénibles, mais ce ne sont en gros que des bases de données.

Il y a des fonctions sur les dates dans Glib, cf. <URL:
http://developer.gnome.org/doc/API/2.0/glib/glib-Date-and-Time-Functions.html >.

Avatar
Fred
Salut à tous,

Soit le code suivant :

----
#include <stdio.h>
#include <time.h>

#define SIZE 256

int main (int argc, char *argv[])
{
time_t td;
struct tm dc;
char buffer[SIZE];

dc.tm_mon = 1; /* Fev */
dc.tm_mday = 16; /* 16 */
dc.tm_year = 64; /* 1964 */
dc.tm_hour = 8; /* 8 h */
dc.tm_min = 0; /* 0 min */
dc.tm_sec = 0; /* 0 sec */
dc.tm_isdst = -1; /* saving time */

td = mktime(&dc);

if (td == -1)
{
printf("Erreur: %ldn", (long)td);
exit(-1);
}
else {
printf("Date == %sn", ctime(&td));
strftime (buffer, SIZE, "Today is %A, %B %d.n", &dc);
}
return 0;
}

Ce code retourne Erreur: -1 pour toute valeur antérieure à 70 dans le
champs dc.tm_year de la struct.

Je sais maintenant que la fonction mktime est limitée à ne gérer que les
dates comprises entre 1/1/70 et 2038.

Ma question: comment (quelles fonctions ou quelles astuces) faire pour
les dates antérieures (pour par exemple retrouver le jour de la semaine,
calculer le nombre de secondes, etc...). Des liens vers des documents
seront suffisants, un bout de code serait un must, mais bon ne vous
prenez pas la tête, c'est juste que je suis assez curieux de savoir.

Merci,

Jacques




Une petite astuce au passage :
Il est intéressant de gérer les dates sous la forme d'un "double"
représentant le nombre de millisecondes écoulées depuis le 1er janvier 1970.
Ceci permet une plage énorme avec une précision variable : dans les
dates actuelles, la précision est de la milliseconde, pour l'époque des
dinosaures (nombre négatif) la précision est plus faible mais ce n'est
pas trop grave.
Pour les dates comprises entre 1970 et 2038, on divise par 1000 et on
peut utiliser les fonctions du genre mktime.
Il reste à traiter les "anomalies" du passage du calendrier julien au
grégorien (anomalies qui ne se situent pas aux mêmes époques suivant le
pays !). Pour la France, il faut tenir compte d'un "trou" de 11 jours
après le 3 septembre 1752. En clair on est passé du 3/9/1752 au
15/9/1752 du jour au lendemain ;-)

A+

Fred

Avatar
Jacques L'helgoualc'h
Le 28-02-2005, Fred a écrit :
[...]
Il reste à traiter les "anomalies" du passage du calendrier julien au
grégorien (anomalies qui ne se situent pas aux mêmes époques suivant le
pays !). Pour la France, il faut tenir compte d'un "trou" de 11 jours
après le 3 septembre 1752. En clair on est passé du 3/9/1752 au
15/9/1752 du jour au lendemain ;-)


Heu, ça c'est en Angleterre, d'après la doc de gcal :
(/usr/share/doc/gcal/GREG-REFORM)

#---------------------------------------

Chronology of Introduction of the Gregorian calendar.


Country Last day of First day of Gcal option
Julian Gregorian
calendar calendar

------------------------------------------------------------------------------

Italy 04-Oct-1582 15-Oct-1582 `--gregorian-reform82,10,05,14'
Spain 04-Oct-1582 15-Oct-1582 `--gregorian-reform82,10,05,14'
Portugal 04-Oct-1582 15-Oct-1582 `--gregorian-reform82,10,05,14'
Poland 04-Oct-1582 15-Oct-1582 `--gregorian-reform82,10,05,14'
France 09-Dec-1582 20-Dec-1582 `--gregorian-reform82,12,10,19'
Luxembourg 21-Dec-1582 01-Jan-1583 `--gregorian-reform82,12,22,31'
Netherlands 21-Dec-1582 01-Jan-1583 `--gregorian-reform82,12,22,31'
Bavaria 05-Oct-1583 16-Oct-1583 `--gregorian-reform83,10,06,15'
Austria 06-Jan-1584 17-Jan-1584 `--gregorian-reform84,01,07,16'
Switzerland 11-Jan-1584 22-Jan-1584 `--gregorian-reform84,01,12,21'
Hungary 21-Oct-1587 01-Nov-1587 `--gregorian-reform87,10,22,31'
Germany 18-Feb-1700 01-Mar-1700 `--gregorian-reform00,02,19,28'
(1)
Norway 18-Feb-1700 01-Mar-1700 `--gregorian-reform00,02,19,28'
Denmark 18-Feb-1700 01-Mar-1700 `--gregorian-reform00,02,19,28'
Great Britain 02-Sep-1752 14-Sep-1752 `--gregorian-reform52,09,03,13'
Sweden 17-Feb-1753 01-Mar-1753 `--gregorian-reform53,02,18,28'
Finland 17-Feb-1753 01-Mar-1753 `--gregorian-reform53,02,18,28'
Japan -- 01-Jan-1873 `--gregorian-reform72,12,20,31'
China -- 20-Nov-1911 `--gregorian-reform11,11,07,19'
Bulgaria 31-Mar-1916 14-Apr-1916 `--gregorian-reform16,04,01,13'
U.S.S.R. 31-Jan-1918 14-Feb-1918 `--gregorian-reform18,02,01,13'
Serbia 18-Jan-1919 01-Feb-1919 `--gregorian-reform19,01,19,31'
Romania 18-Jan-1919 01-Feb-1919 `--gregorian-reform19,01,19,31'
Greece 09-Mar-1924 23-Mar-1924 `--gregorian-reform24,03,10,22'
Turkey 18-Dec-1925 01-Jan-1926 `--gregorian-reform25,12,19,31'
Egypt 17-Sep-1928 01-Oct-1928 `--gregorian-reform28,09,18,30'

Reference:
S.J. Seleschnikow, "Wieviele Monde hat das Jahr?" (Kleine
Kalenderkunde), Aulis-Verlag Deubner & Co. KG, K"oln, 1'te Auflage
1981, ISBN 3-7516-060-2

---------- Footnotes ----------

(1) In protestant parts of Germany. In some catholic minor states
(Westfalen, W"urzburg, Mainz, Freiburg etc.), the new calendar was
introduced during the years 1583/1584.

#---------------------------------------

--
Jacques L'helgoualc'h

Avatar
Nicolas George
Fred wrote in message <cvuokg$9lf$:
Il est intéressant de gérer les dates sous la forme d'un "double"
représentant le nombre de millisecondes écoulées depuis le 1er janvier 1970.


Pourquoi travailler avec des millisecondes si c'est un double ? La seconde
est quand même en général plus pratique.

D'un autre côté, personnellement, je n'aime pas tant que ça utiliser des
flottants quand ce n'est pas réellement nécessaire. D'abord, la précision
est toujours un peu floue, en particulier on ne peut souvent pas utiliser
une vraie égalité pour comparer deux flottants. Ensuite, sur un matériel
dénué de FPU mais pour lequel on n'a pas compilé dans ce sens, ça peut être
très coûteux.

Personnellement, j'ai un petit faible pour la représentation en
microsecondes sur un entier 64 bits : ça offre un bon comprimis entre la
précision, la durée de validité, et la manipulation efficace par les
processeurs et compilateurs actuels.

Avatar
Fred
[...]

Il reste à traiter les "anomalies" du passage du calendrier julien au
grégorien (anomalies qui ne se situent pas aux mêmes époques suivant le
pays !). Pour la France, il faut tenir compte d'un "trou" de 11 jours
après le 3 septembre 1752. En clair on est passé du 3/9/1752 au
15/9/1752 du jour au lendemain ;-)



Heu, ça c'est en Angleterre, d'après la doc de gcal :
(/usr/share/doc/gcal/GREG-REFORM)

#---------------------------------------

Chronology of Introduction of the Gregorian calendar.


Country Last day of First day of Gcal option
Julian Gregorian
calendar calendar

------------------------------------------------------------------------------

Italy 04-Oct-1582 15-Oct-1582 `--gregorian-reform82,10,05,14'
Spain 04-Oct-1582 15-Oct-1582 `--gregorian-reform82,10,05,14'
Portugal 04-Oct-1582 15-Oct-1582 `--gregorian-reform82,10,05,14'
Poland 04-Oct-1582 15-Oct-1582 `--gregorian-reform82,10,05,14'
France 09-Dec-1582 20-Dec-1582 `--gregorian-reform82,12,10,19'
Luxembourg 21-Dec-1582 01-Jan-1583 `--gregorian-reform82,12,22,31'
Netherlands 21-Dec-1582 01-Jan-1583 `--gregorian-reform82,12,22,31'
Bavaria 05-Oct-1583 16-Oct-1583 `--gregorian-reform83,10,06,15'
Austria 06-Jan-1584 17-Jan-1584 `--gregorian-reform84,01,07,16'
Switzerland 11-Jan-1584 22-Jan-1584 `--gregorian-reform84,01,12,21'
Hungary 21-Oct-1587 01-Nov-1587 `--gregorian-reform87,10,22,31'
Germany 18-Feb-1700 01-Mar-1700 `--gregorian-reform00,02,19,28'
(1)
Norway 18-Feb-1700 01-Mar-1700 `--gregorian-reform00,02,19,28'
Denmark 18-Feb-1700 01-Mar-1700 `--gregorian-reform00,02,19,28'
Great Britain 02-Sep-1752 14-Sep-1752 `--gregorian-reform52,09,03,13'
Sweden 17-Feb-1753 01-Mar-1753 `--gregorian-reform53,02,18,28'
Finland 17-Feb-1753 01-Mar-1753 `--gregorian-reform53,02,18,28'
Japan -- 01-Jan-1873 `--gregorian-reform72,12,20,31'
China -- 20-Nov-1911 `--gregorian-reform11,11,07,19'
Bulgaria 31-Mar-1916 14-Apr-1916 `--gregorian-reform16,04,01,13'
U.S.S.R. 31-Jan-1918 14-Feb-1918 `--gregorian-reform18,02,01,13'
Serbia 18-Jan-1919 01-Feb-1919 `--gregorian-reform19,01,19,31'
Romania 18-Jan-1919 01-Feb-1919 `--gregorian-reform19,01,19,31'
Greece 09-Mar-1924 23-Mar-1924 `--gregorian-reform24,03,10,22'
Turkey 18-Dec-1925 01-Jan-1926 `--gregorian-reform25,12,19,31'
Egypt 17-Sep-1928 01-Oct-1928 `--gregorian-reform28,09,18,30'

Reference:
S.J. Seleschnikow, "Wieviele Monde hat das Jahr?" (Kleine
Kalenderkunde), Aulis-Verlag Deubner & Co. KG, K"oln, 1'te Auflage
1981, ISBN 3-7516-060-2

---------- Footnotes ----------

(1) In protestant parts of Germany. In some catholic minor states
(Westfalen, W"urzburg, Mainz, Freiburg etc.), the new calendar was
introduced during the years 1583/1584.

#---------------------------------------

Très bien ! Y-en a 1 qui suit ;-)

Fred


Avatar
Laurent Wacrenier
Jacques L'helgoualc'h <lhh+ écrit:
France 09-Dec-1582 20-Dec-1582 `--gregorian-reform82,12,10,19'


C'est bon pour la France de l'époque. Pour l'Alsace par exemple, la
longue nuit a eu lieu en 1648 (avec des particularités pour Strasbourg
ou si on était catholique ou protestant).