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 ?