IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Afficher date/heure (optimisation de code)


Sujet :

C

  1. #1
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Points : 314
    Points
    314
    Par défaut Afficher date/heure (optimisation de code)
    Bonjour,

    j'ai une variable sur 32bits qui représente le nombre de secondes qui se sont écoulées depuis 1970 (protocole SNTP).

    J'ai fait une fonction pour convertir ce nombre en une chaine de caractère lisible par un humain. Voici ce que ça donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
     
    // converti une valeur de temps SNTP en chaine de caractère lisible par un humain
    // le buffer doit au moins faire 27 caractères
    void GetSNTPTime(unsigned char *ptStr){
    	// SNTP time => nombre de secondes depuis 1970 (32bits)
     
    	DWORD myValSNTP, myValSNTP2, myValSNTP3;
    	unsigned int myAnnee;
    	unsigned char myMois, myJour, myHeure, myMinute, mySeconde;
    	unsigned char nbrBissextile=0, nbrMois, nbrAnnees, isBissextile=0;
    	unsigned int nbrJours;
     
    	unsigned char myStrTmp[5];
     
    	myValSNTP = SNTPGetUTCSeconds();
     
    	// premiere année bissextile en 1972
    	nbrAnnees = (myValSNTP / 31536000); // (365*24*60*60) = 31536000 // nombre d'années depuis 1970
    	myAnnee = 1970 + nbrAnnees;
     
    	if (nbrAnnees > 1){ // vérifie qu'on est au moin en 1972
    		nbrBissextile = ((nbrAnnees - 2 ) / 4) + 1;	// nombre d'année bissextile
    											// attention, il faut faire n-1 si on est avant le 29 février d'une année bissextile
    	}
     
    	if (((nbrBissextile*4) + 2) == nbrAnnees){ // detecte si on est une année bissextile
    		isBissextile = 1;
    	}
     
    	// valeur SNTP du premier jour de l'année
    	myValSNTP2 = ((DWORD)nbrAnnees * 31536000) + ((DWORD)(nbrBissextile - isBissextile)*86400); // (24*60*60) = 86400
     
    	myValSNTP2 = myValSNTP - myValSNTP2; // temps restant dans l'année
    	nbrJours = (unsigned int)(myValSNTP2 / 86400)+1; // nombre de jours restant dans l'année
     
    	if (nbrJours <= 31){ // janvier
    		myMois = 1;
    		myJour = nbrJours;
    	} else if (nbrJours <= (59)){ // fevrier
    		myMois = 2;
    		myJour = (nbrJours - 31);
    	} else if (nbrJours <= (90)){ // mars
    		myMois = 3;
    		myJour = (nbrJours - (59));
    	} else if (nbrJours <= (120)){ // avril
    		myMois = 4;
    		myJour = (nbrJours - (90));
    	} else if (nbrJours <= (151)){ // mai
    		myMois = 5;
    		myJour = (nbrJours - (120));
    	} else if (nbrJours <= (181)){ // juin
    		myMois = 6;
    		myJour = (nbrJours - (151));
    	} else if (nbrJours <= (212)){ // juillet
    		myMois = 7;
    		myJour = (nbrJours - (181));
    	} else if (nbrJours <= (243)){ // aout
    		myMois = 8;
    		myJour = (nbrJours - (212));
    	} else if (nbrJours <= (273)){ // septembre
    		myMois = 9;
    		myJour = (nbrJours - (243));
    	} else if (nbrJours <= (304)){ // octobre
    		myMois = 10;
    		myJour = (nbrJours - (273));
    	} else if (nbrJours <= (334)){ // novembre
    		myMois = 11;
    		myJour = (nbrJours - (304));
    	} else { // descembre
    		myMois = 12;
    		myJour = (nbrJours - (334));
    	}
     
     
    	if (isBissextile){ // detecte si on est une année bissextile
    		if (myMois >= 3){ // on doit corriger la date de -1 jour
    			if (myJour == 1){
    				myMois--;
     
    				switch (myMois){
    					case (2):
    						myJour = 29;
    						break;
    					case (3):
    						myJour = 31;
    						break;
    					case (4):
    						myJour = 30;
    						break;
    					case (5):
    						myJour = 31;
    						break;
    					case (6):
    						myJour = 30;
    						break;
    					case (7):
    						myJour = 31;
    						break;
    					case (8):
    						myJour = 31;
    						break;
    					case (9):
    						myJour = 30;
    						break;
    					case (10):
    						myJour = 31;
    						break;
    					case (11):
    						myJour = 30;
    						break;
    				}
    			} else {
    				myJour--;
    			}			
    		}
    	}
     
     
     
     
    	// ******************** Gestion des heures **************************
    	myValSNTP3 = myValSNTP2/86400;
    	myValSNTP3 *= 86400;
     
    	myValSNTP2 = myValSNTP2 - myValSNTP3; // temps restant dans la journée
    	//ultoa(myValSNTP2, toto);
    	//putrsUART("\r\n");
    	//putsUART(toto);
     
    	myHeure = (myValSNTP2 / 3600); 
    	myValSNTP2 = myValSNTP2 - ((unsigned long)myHeure * 3600); //reste minute
     
    	myMinute = (myValSNTP2 / 60); 
    	myValSNTP2 = myValSNTP2 - ((unsigned long)myMinute * 60); //reste secondes
     
    	mySeconde = myValSNTP2;
    	// ******************************************************************
     
    	// jours
    	uitoa(myJour, myStrTmp);
    	if (myJour<10){
    		*ptStr++ ='0';
    	}
    	strcpy(ptStr, myStrTmp);
    	ptStr += strlen(myStrTmp);
    	*ptStr++ ='/';
     
    	// mois
    	uitoa(myMois, myStrTmp);
    	if (myMois<10){
    		*ptStr++ ='0';
    	}
    	strcpy(ptStr, myStrTmp);
    	ptStr += strlen(myStrTmp);
    	*ptStr++ ='/';
     
    	// année
    	uitoa(myAnnee, myStrTmp);
    	strcpy(ptStr, myStrTmp);
    	ptStr += strlen(myStrTmp);
     
    	*ptStr++ =' ';
     
    	// heure
    	uitoa(myHeure, myStrTmp);
    	if (myHeure<10){
    		*ptStr++ ='0';
    	}
    	strcpy(ptStr, myStrTmp);
    	ptStr += strlen(myStrTmp);
    	*ptStr++ =':';
     
    	// minute
    	uitoa(myMinute, myStrTmp);
    	if (myMinute<10){
    		*ptStr++ ='0';
    	}
    	strcpy(ptStr, myStrTmp);
    	ptStr += strlen(myStrTmp);
    	*ptStr++ =':';
     
    	// seconde
    	uitoa(mySeconde, myStrTmp);
    	if (mySeconde<10){
    		*ptStr++ ='0';
    	}
    	strcpy(ptStr, myStrTmp);
    	ptStr += strlen(myStrTmp);
     
    	*ptStr ='\0';
    }
    - j'ai l'impression que j'ai fait une usine à gaz, qu'en pensez-vous ? n'y a t-il pas moyen de simplifier/optimiser le code ?
    - aussi j'aimerais gérer les décalage horaire ainsi que les heures d'hivers/été : comment ça se gère ? est-ce que tous les pays gère les heures d'hivers/été comme chez nous ou il faut traiter cas par cas chaque fuseau horaire/pays ?

  2. #2
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Sur la majorité des systèmes (citons Windows et tous les systèmes unixoïdes), la fonction time retourne le nombre de secondes écoulées depuis 1970 (0h0mn0s GMT). La norme ne garantit cependant que cette fonction retourne un "timestamp", peu importe l'origine prise par une implémentation particulière. Si t'es sous Windows UNIX, tu pourras alors utiliser la fonction ctime pour convertir un timestamp en chaine (il y a aussi mktime pour récupérer les composantes de la date : date, heure, minute, seconde, etc.). Tout ça c'est dans time.h. Sinon, en ce qui concerne ta fonction, je n'ai pas pu lire hélas mais si elle fonctionne ... elle est bonne . Mais je vois déjà plein de cast . Inutile de caster un unsigned char en unsigned int par exemple ...

  3. #3
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    il y a aussi strftime qui convertit en chaîne direct...

    pourquoi faire simple quand on peut faire compliqué

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 369
    Points
    50 369
    Par défaut
    Citation Envoyé par Emcy Voir le message
    - aussi j'aimerais gérer les décalage horaire ainsi que les heures d'hivers/été : comment ça se gère ? est-ce que tous les pays gère les heures d'hivers/été comme chez nous ou il faut traiter cas par cas chaque fuseau horaire/pays ?
    Tu t'engages dans une galère innommable sur ce point.
    - Certains pays on des décalages horaires en 1/4 d'heure par exemple (Iran à UTC+3:30, Afghanistan à UTC+4:30, Inde à UTC+4:30 ou même Népal à UTC+5:45).
    - Les dates de changement heure d'été/hiver ne sont pas constantes d'une année à l'autre en fonction des pays

    Juste un petit extrait de Wiki (http://fr.wikipedia.org/wiki/Fuseau_horaire) pour te donner une idée du flou artistique qui règne :

    Au total, l'ensemble des pays du globe utilise à l'heure actuelle 42 fuseaux
    horaires (en comptant UTC+8:45 qui n'est pas un fuseau officiel), dont 37
    toute l'année (mais pas forcément par les mêmes pays), deux seulement à
    l'heure d'hiver boréale (UTC-3:30 et UTC+3:30), un uniquement à l'heure
    d'hiver australe (UTC+12:45), un exclusivement à l'heure d'été boréale
    (UTC-2:30), un dernier uniquement à l'heure d'été australe (UTC+13:45).

  5. #5
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    la biblothèque standard fournit toutes les routines nécessaires, ainsi que les structures, pourquoi s'embêter ?

    gmtime, mktime, il y a les time-zones, il y a mle formattages strftime + (ma fonction dans les sources MkTimeFromGMT)

    Pourquoi ré-inventer le fil à couper le beurre ?

  6. #6
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Emcy Voir le message
    j'ai une variable sur 32bits qui représente le nombre de secondes qui se sont écoulées depuis 1970 (protocole SNTP).

    J'ai fait une fonction pour convertir ce nombre en une chaine de caractère lisible par un humain. Voici ce que ça donne :
    <...>
    - j'ai l'impression que j'ai fait une usine à gaz, qu'en pensez-vous ? n'y a t-il pas moyen de simplifier/optimiser le code ?
    - aussi j'aimerais gérer les décalage horaire ainsi que les heures d'hivers/été : comment ça se gère ? est-ce que tous les pays gère les heures d'hivers/été comme chez nous ou il faut traiter cas par cas chaque fuseau horaire/pays ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    #include <stdio.h>
    #include <time.h>
     
    unsigned long SNTPGetUTCSeconds (void)
    {
       /* simulation */
       return (unsigned long) time (NULL);
    }
     
    /* converti une valeur de temps SNTP en chaine de caractère lisible par un humain */
    /* le buffer doit au moins faire 27 caractères */
    void GetSNTPTime (char *s, size_t size)
    {
       /* SNTP time => nombre de secondes depuis 1970 (32bits) */
       time_t myValSNTP = SNTPGetUTCSeconds ();
     
    /*
       Il y a peut être une correction à faire selon l'Epoch du système. 
       Sous unixoide, c'est OK.
     
       http://fr.wikipedia.org/wiki/Epoch
     
    */
       struct tm tm = *localtime (&myValSNTP);
     
       strftime (s, size, "%d/%m/%Y %H:%M:%s", &tm);
    }
     
    int main (void)
    {
       char s[128];
       GetSNTPTime (s, sizeof s);
       printf ("now = '%s'\n", s);
       return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    now = '05/06/2008 07:58:'
     
    Press ENTER to continue.
    Désolé...

  7. #7
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Points : 314
    Points
    314
    Par défaut
    hello,

    ça serait trop facile si je pouvais utiliser des bibliothèques standard... j'utilise un µC 8 bits (PIC18F microchip) et j'ai recherché sur le site du constructeur mais la bibliothèque time.h n'existe qu'à partir des µC 16 bits ...

    Pour le fuseau horaire, je pensais créer un champs où l'on rentre le décalage horaire plutôt que la région comme ça ça simplifiera grandement le boulot : je n'aurai pas besoin de connaitre les fuseaux horaires de tous les pays...
    Je pense aussi créer par la suite une autre fonction qui indiquera le décalage horaire en fonction de la région (mais si elle ne gérera pas tous les pays, l'utilisateur pourra toujours rentrer manuellement le décalage).

    Par contre pour l'histoire d'heure d'hivers/été, je risque d'être bloqué...

    J'ai besoin de faire la conversion car j'envoie des emails lorsque je détecte une alarme avec l'heure => est-ce qu'il y aurait un moyen de n'envoyer que le timestamp (que la conversion se fasse automatiquement coté client) ?

  8. #8
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Emcy Voir le message
    ça serait trop facile si je pouvais utiliser des bibliothèques standard... j'utilise un µC 8 bits (PIC18F microchip) et j'ai recherché sur le site du constructeur mais la bibliothèque time.h n'existe qu'à partir des µC 16 bits ...
    Il aurait peut être mieux valu le préciser avant, non ? On passe pour des truffes, merci...

  9. #9
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Points : 314
    Points
    314
    Par défaut
    Désolé pour vous avoir fait perdre votre temps, j'aurais du y penser...

    Gérer les heures hivers/été me semble beaucoup trop complexe à gérer (sauf si vous avez la solution miracle), c'est pourquoi je vais partir sur une autre solution : l'utilisateur devra configurer un champs "décalage horaire" => il faudra donc qu'il change deux fois par an cette valeur (si on est en France) : c'est pas super pratique mais c'est ce qu'il me semble le plus judicieux...
    Donc je suis ouvert à toute proposition pour améliorer mon code (si besoin est) car vu que je suis sur un µC j'aimerais autant que possible éviter de perdre des ressources inutilement ...
    => PS : je viens de voir une erreur sur la détection des années bissextile : je suis dessus...
    EDIT : c'est bon j'ai corrigé le problème => j'ai modifié mon premier post

    Aussi, j'ai une autre question : les années bissextiles, c'est bien pour tous les Pays ?

  10. #10
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Emcy Voir le message
    Gérer les heures hivers/été me semble beaucoup trop complexe à gérer (sauf si vous avez la solution miracle), c'est pourquoi je vais partir sur une autre solution : l'utilisateur devra configurer un champs "décalage horaire" => il faudra donc qu'il change deux fois par an cette valeur (si on est en France) : c'est pas super pratique mais c'est ce qu'il me semble le plus judicieux...
    En Europe communautaire, il y une règle précise (dernier WE d'avril ? etc.). Mais le serveur de temps ne sait pas indiquer l'information ? Ca m'étonnerait qu'il ne donne que le T.U. brut.
    Donc je suis ouvert à toute proposition pour améliorer mon code (si besoin est) car vu que je suis sur un µC j'aimerais autant que possible éviter de perdre des ressources inutilement ...
    Légèrement découragé pour le moment...

    Peut être http://emmanuel-delahaye.developpez....theque-clib-c/
    Module DATE

    pour certaines parties du code...
    Aussi, j'ai une autre question : les années bissextiles, c'est bien pour tous les Pays ?
    Si ils adhèrent à l'heure légale, oui. La question peut se poser pour les pays israélites, musulmans (rythme lunaire) et orthodoxes (pas de réforme 'Julienne' du calendrier)... (pas de troll, merci).

  11. #11
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Points : 314
    Points
    314
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Mais le serveur de temps ne sait pas indiquer l'information ? Ca m'étonnerait qu'il ne donne que le T.U. brut.
    => non, c'est le protocole SNTP qui veut ça...

  12. #12
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Emcy Voir le message
    => non, c'est le protocole SNTP qui veut ça...
    Oui, en y repensant à 2 fois, c'est logique. On reçoit le T.U. et après on fait les ajustements locaux...

  13. #13
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Emcy Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
     
    // converti une valeur de temps SNTP en chaine de caractère lisible par un humain
    // le buffer doit au moins faire 27 caractères
    void GetSNTPTime(unsigned char *ptStr){
    	// SNTP time => nombre de secondes depuis 1970 (32bits)
     
    	DWORD myValSNTP, myValSNTP2, myValSNTP3;
    	unsigned int myAnnee;
    	unsigned char myMois, myJour, myHeure, myMinute, mySeconde;
    	unsigned char nbrBissextile=0, nbrMois, nbrAnnees, isBissextile=0;
    	unsigned int nbrJours;
     
    	unsigned char myStrTmp[5];
     
    	myValSNTP = SNTPGetUTCSeconds();
     
    	// premiere année bissextile en 1972
    	nbrAnnees = (myValSNTP / 31536000); // (365*24*60*60) = 31536000 // nombre d'années depuis 1970
    	myAnnee = 1970 + nbrAnnees;
     
    	if (nbrAnnees > 1){ // vérifie qu'on est au moin en 1972
    		nbrBissextile = ((nbrAnnees - 2 ) / 4) + 1;	// nombre d'année bissextile
    											// attention, il faut faire n-1 si on est avant le 29 février d'une année bissextile
    	}
     
    	if (((nbrBissextile*4) + 2) == nbrAnnees){ // detecte si on est une année bissextile
    		isBissextile = 1;
    	}
     
    	// valeur SNTP du premier jour de l'année
    	myValSNTP2 = ((DWORD)nbrAnnees * 31536000) + ((DWORD)(nbrBissextile - isBissextile)*86400); // (24*60*60) = 86400
     
    	myValSNTP2 = myValSNTP - myValSNTP2; // temps restant dans l'année
    	nbrJours = (unsigned int)(myValSNTP2 / 86400)+1; // nombre de jours restant dans l'année
     
    	if (nbrJours <= 31){ // janvier
    		myMois = 1;
    		myJour = nbrJours;
    	} else if (nbrJours <= (59)){ // fevrier
    		myMois = 2;
    		myJour = (nbrJours - 31);
    	} else if (nbrJours <= (90)){ // mars
    		myMois = 3;
    		myJour = (nbrJours - (59));
    	} else if (nbrJours <= (120)){ // avril
    		myMois = 4;
    		myJour = (nbrJours - (90));
    	} else if (nbrJours <= (151)){ // mai
    		myMois = 5;
    		myJour = (nbrJours - (120));
    	} else if (nbrJours <= (181)){ // juin
    		myMois = 6;
    		myJour = (nbrJours - (151));
    	} else if (nbrJours <= (212)){ // juillet
    		myMois = 7;
    		myJour = (nbrJours - (181));
    	} else if (nbrJours <= (243)){ // aout
    		myMois = 8;
    		myJour = (nbrJours - (212));
    	} else if (nbrJours <= (273)){ // septembre
    		myMois = 9;
    		myJour = (nbrJours - (243));
    	} else if (nbrJours <= (304)){ // octobre
    		myMois = 10;
    		myJour = (nbrJours - (273));
    	} else if (nbrJours <= (334)){ // novembre
    		myMois = 11;
    		myJour = (nbrJours - (304));
    	} else { // descembre
    		myMois = 12;
    		myJour = (nbrJours - (334));
    	}
     
     
    	if (isBissextile){ // detecte si on est une année bissextile
    		if (myMois >= 3){ // on doit corriger la date de -1 jour
    			if (myJour == 1){
    				myMois--;
     
    				switch (myMois){
    					case (2):
    						myJour = 29;
    						break;
    					case (3):
    						myJour = 31;
    						break;
    					case (4):
    						myJour = 30;
    						break;
    					case (5):
    						myJour = 31;
    						break;
    					case (6):
    						myJour = 30;
    						break;
    					case (7):
    						myJour = 31;
    						break;
    					case (8):
    						myJour = 31;
    						break;
    					case (9):
    						myJour = 30;
    						break;
    					case (10):
    						myJour = 31;
    						break;
    					case (11):
    						myJour = 30;
    						break;
    				}
    			} else {
    				myJour--;
    			}			
    		}
    	}
     
     
     
     
    	// ******************** Gestion des heures **************************
    	myValSNTP3 = myValSNTP2/86400;
    	myValSNTP3 *= 86400;
     
    	myValSNTP2 = myValSNTP2 - myValSNTP3; // temps restant dans la journée
    	//ultoa(myValSNTP2, toto);
    	//putrsUART("\r\n");
    	//putsUART(toto);
     
    	myHeure = (myValSNTP2 / 3600); 
    	myValSNTP2 = myValSNTP2 - ((unsigned long)myHeure * 3600); //reste minute
     
    	myMinute = (myValSNTP2 / 60); 
    	myValSNTP2 = myValSNTP2 - ((unsigned long)myMinute * 60); //reste secondes
     
    	mySeconde = myValSNTP2;
    	// ******************************************************************
     
    	// jours
    	uitoa(myJour, myStrTmp);
    	if (myJour<10){
    		*ptStr++ ='0';
    	}
    	strcpy(ptStr, myStrTmp);
    	ptStr += strlen(myStrTmp);
    	*ptStr++ ='/';
     
    	// mois
    	uitoa(myMois, myStrTmp);
    	if (myMois<10){
    		*ptStr++ ='0';
    	}
    	strcpy(ptStr, myStrTmp);
    	ptStr += strlen(myStrTmp);
    	*ptStr++ ='/';
     
    	// année
    	uitoa(myAnnee, myStrTmp);
    	strcpy(ptStr, myStrTmp);
    	ptStr += strlen(myStrTmp);
     
    	*ptStr++ =' ';
     
    	// heure
    	uitoa(myHeure, myStrTmp);
    	if (myHeure<10){
    		*ptStr++ ='0';
    	}
    	strcpy(ptStr, myStrTmp);
    	ptStr += strlen(myStrTmp);
    	*ptStr++ =':';
     
    	// minute
    	uitoa(myMinute, myStrTmp);
    	if (myMinute<10){
    		*ptStr++ ='0';
    	}
    	strcpy(ptStr, myStrTmp);
    	ptStr += strlen(myStrTmp);
    	*ptStr++ =':';
     
    	// seconde
    	uitoa(mySeconde, myStrTmp);
    	if (mySeconde<10){
    		*ptStr++ ='0';
    	}
    	strcpy(ptStr, myStrTmp);
    	ptStr += strlen(myStrTmp);
     
    	*ptStr ='\0';
    }
    Salut Emcy,

    Je m'aperçois enfin que je ne suis pas le seul à galérer à trouver un code du genre gmtime() ou autre fonction de time.c qui tourne sous un µC 8bit.
    Je vois que le sujet date un peu et je aimerais avoir un retour sur le code que tu as donné au 1er post.

    Y a t il eu des modifs, des library adaptées etc..

    Merci d'avance.

    Marc

Discussions similaires

  1. Afficher date/heure dans un graphe
    Par kronanberg dans le forum MATLAB
    Réponses: 7
    Dernier message: 01/06/2011, 15h20
  2. format date/heure dans le code
    Par Invité dans le forum VBA Access
    Réponses: 2
    Dernier message: 19/10/2007, 20h24
  3. Réponses: 2
    Dernier message: 07/04/2007, 16h57
  4. afficher l'heure et date
    Par ulysse031 dans le forum AWT/Swing
    Réponses: 8
    Dernier message: 24/03/2007, 15h22
  5. [Dates] Afficher à des heures aléatoires ?
    Par kevinf dans le forum Langage
    Réponses: 20
    Dernier message: 02/12/2006, 23h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo