MKTIME |
Fabriquer le temps |
---|---|
Langage C | time.h |
Syntaxe
time_t *mktime(struct tm *ptrheure) |
Paramètres
Nom | Description |
---|---|
ptrheure | Ce paramètre permet d'indiquer le temps à traiter |
Description
Cette fonction permet de convertir des heures locales en heures normalisé.
Algorithme
MODULE MKTIME(tm_ptr) * Normaliser la structure tm (ajuster les valeurs si nécessaire) normalize(tm_ptr) * Calculer le nombre de secondes depuis l'époque Unix (1er janvier 1970) seconds ← 0 * Ajouter les secondes pour les années BOUCLE POUR year ← 1970 JUSQU'A tm_ptr.year FAIRE seconds ← seconds + days_in_year(year) x 24 x 60 x 60 FIN BOUCLE POUR * Ajouter les secondes pour les mois BOUCLE POUR month ← 1 JUSQU'A tm_ptr.month FAIRE seconds ← seconds + days_in_month(tm_ptr.year, month) x 24 x 60 x 60 FIN BOUCLE POUR * Ajouter les secondes pour les jours seconds ← seconds + tm_ptr.day x 24 x 60 x 60 * Ajouter les secondes pour les heures, minutes et secondes seconds ← seconds tm_ptr.hour x 60 x 60 seconds ← seconds tm_ptr.minute x 60 seconds ← seconds tm_ptr.second * Retourner le nombre total de secondes depuis l'époque Unix RETOURNE seconds |
Remarques
- Conversion de struct tm en horodatage : La fonction mktime est utilisée pour convertir une structure struct tm (contenant des informations sur une date et une heure décomposées) en un objet time_t (un horodatage exprimé en secondes depuis l'époque Unix, le 1er janvier 1970). Cela permet de manipuler les dates sous forme de seconds.
- Modification de la structure tm : En plus de convertir la structure en time_t, mktime normalise les champs de la structure struct tm. Par exemple, si l'utilisateur fournit une valeur d'heure de 25 (au lieu de 24 heures maximum), elle sera ajustée en une heure supplémentaire au jour suivant. Cela permet une gestion souple des dates et des heures.
- Support des fuseaux horaires : mktime prend en compte le fuseau horaire local de la machine sur laquelle elle est exécutée. Par défaut, elle applique le fuseau horaire défini par la variable d'environnement TZ ou par les paramètres système. Cela peut affecter les résultats si le fuseau horaire est modifié entre deux appels.
- Gestion des transitions d'heure : La fonction mktime tient compte des transitions entre l'heure standard et l'heure d'été (DST). Lorsque la structure struct tm contient un champ tm_isdst (indiquant si l'heure d'été est active), la fonction ajuste automatiquement la valeur time_t en conséquence. Si ce champ est défini à -1, mktime essaie de déterminer automatiquement si DST s'applique.
- Utilisation pour manipuler des dates : mktime est souvent utilisée pour manipuler ou comparer des dates. Par exemple, en soustrayant deux valeurs time_t, il est possible de calculer la différence entre deux dates en secondes, facilitant ainsi le calcul des durées ou des intervalles de temps.
- Dépendance à l'implémentation : Bien que conforme à la norme C, le comportement de mktime peut varier légèrement selon les implémentations de la bibliothèque standard et les limitations spécifiques des systèmes sous-jacents. Par exemple, certaines implémentations peuvent ne pas gérer correctement les dates très éloignées de l'époque Unix (avant 1970 ou après 2038 sur des systèmes 32 bits).
- Erreurs et valeurs hors limites : Si les champs de struct tm sont initialisés avec des valeurs non valides (comme un mois inférieur à 0 ou supérieur à 11), mktime normalise ces valeurs en ajustant les autres champs. Cependant, si la date normalisée est en dehors des plages supportées (par exemple, une date négative), la fonction retourne -1, ce qui doit être vérifié par le programme pour éviter des comportements imprévus.
Exemple
Voici un exemple permettant de calculer le nombre de jours entre deux dates à l'aide de cette fonction :
Essayer maintenant !
- #include <stdio.h>
- #include <time.h>
-
- int GetNumberDaysBetween2Dates(char *date1, char *date2) {
- struct tm timestamp1,timestamp2;
- sscanf(date1,"%i-%i-%i",×tamp1.tm_year,×tamp1.tm_mon,×tamp1.tm_mday);
- sscanf(date2,"%i-%i-%i",×tamp2.tm_year,×tamp2.tm_mon,×tamp2.tm_mday);
- timestamp1.tm_sec = timestamp1.tm_min = timestamp1.tm_hour = timestamp1.tm_yday = timestamp1.tm_isdst = 0;
- timestamp1.tm_year -= 1900;
- timestamp1.tm_mon--;
- timestamp2.tm_sec = timestamp2.tm_min = timestamp2.tm_hour = timestamp2.tm_yday = timestamp2.tm_isdst = 0;
- timestamp2.tm_year -= 1900;
- timestamp2.tm_mon--;
- return abs(mktime(×tamp2) - mktime(×tamp1))/86400;
- }
-
- int main() {
- printf("2011-01-01 au 2011-12-31 = %i jours\n",GetNumberDaysBetween2Dates("2011-1-1","2011-12-31"));
- printf("2011-12-31 au 2011-01-01 = %i jours\n",GetNumberDaysBetween2Dates("2011-12-31","2011-1-1"));
- printf("2011-06-15 au 2011-08-01 = %i jours\n",GetNumberDaysBetween2Dates("2011-6-15","2011-8-01"));
- printf("2011-06-15 au 2011-06-19 = %i jours\n",GetNumberDaysBetween2Dates("2011-6-15","2011-6-19"));
- printf("2011-06-15 au 2011-06-16 = %i jours\n",GetNumberDaysBetween2Dates("2011-6-15","2011-6-16"));
- printf("2011-06-15 au 2011-06-15 = %i jours\n",GetNumberDaysBetween2Dates("2011-06-15","2011-06-15"));
- return 0;
- }
on obtiendra le résultat suivant :
2011-01-01 au 2011-12-31 =364 jours2011-12-31 au 2011-01-01 =364 jours
2011-06-15 au 2011-08-01 =47 jours
2011-06-15 au 2011-06-19 =4 jours
2011-06-15 au 2011-06-16 =1 jours
2011-06-15 au 2011-06-15 =0 jours
Voir également
Langage de programmation - C - Référence de procédures et fonctions - localtime
Langage de programmation - C - Référence de procédures et fonctions - time
Langage de programmation - C++ - Référence de procédures et fonctions - mktime
Références
Langage C, Edition Micro-Application, Gehard Willms, 2001, ISBN: 2-7429-2008-0, page 733.
Borland C++ for Windows 4.0, Library Reference, Edition Borland, 1993, Part # BCP1240WW21772, page 179.
Dernière mise à jour : Mardi, le 28 juillet 2015