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 :

Conversion de date GMT en date locale


Sujet :

C

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juin 2006
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 85
    Points : 113
    Points
    113
    Par défaut Conversion de date GMT en date locale
    Bonjour,

    J'aimerais convertir une strucutre tm en "gmt" en une structure tm en "locale", en utilisant uniquement les fonctions du <time.h> pour la compatibilité entre OS.

    Si quelqu'un a les fonctions toute faites, merci.

    Je me suis un peu renseigné tout de même, il semblerait que la fonction "mktime" renvoie le timestamp d'une structure tm en "locale", dommage pour récupérer le timestamp, est-ce qu'il aurait un équivalent pour les structures tm en "gmt"? Il me semble pas mais bon.

    J'ai aussi pu voir à droite à gauche que certains utilisaient l'élément "tm_isdst" de la structure tm, mais j'ai trouvé très peu d'explications sur sa signification. Est-ce que quelqu'un pourra m'en donner?

    Merci d'avance à tous ceux qui éclairciront ma lumière.

  2. #2
    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 : 67
    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 emiaille
    J'aimerais convertir une strucutre tm en "gmt" en une structure tm en "locale", en utilisant uniquement les fonctions du <time.h> pour la compatibilité entre OS.
    Une combinaison astucieuse de
    • struct tm
    • mktime()
    • localtime()
    • gmtime()

    devrait répondre à ta question. Bien lire la doc des fonctions et de la structure. Ne pas hésiter à expérimenter chaque fonction avant de les utiliser vraiment...
    Pas de Wi-Fi à la maison : CPL

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juin 2006
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 85
    Points : 113
    Points
    113
    Par défaut
    Merci c'est ce que je vais faire de toute façon, mais j'aime quand même bien m'appuyer sur du concret.
    Je n'aime pas jouer à l'apprenti sorcier sur des choses que je ne maîtrise pas, d'ailleurs ce serait sympa pour les informaticiens de supprimer le changement d'heure.

    Cet élément "tm_isdst" m'intrigue, j'ai un peu de mal à comprendre les conditions pour qu'il soit à 0 ou à 1.

  4. #4
    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 : 67
    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 emiaille
    Cet élément "tm_isdst" m'intrigue, j'ai un peu de mal à comprendre les conditions pour qu'il soit à 0 ou à 1.
    C'est 1 pour l'heure d'été, non ? (IS Daylight Save Time ?)

    http://www.linux-kheops.com/doc/man/...3/ctime.3.html
    Pas de Wi-Fi à la maison : CPL

  5. #5
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juin 2006
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 85
    Points : 113
    Points
    113
    Par défaut
    Oui tu as raison je viens d'essayer, c'est ça, c'est très con en fait.
    Je vais bricoler un truc en utilisant ça, merci.

  6. #6
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    tu as le source que j'ai mis ici (adaptation de mktime en temp GMT)

    http://www.developpez.net/forums/sho...d.php?t=280214
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  7. #7
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juin 2006
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 85
    Points : 113
    Points
    113
    Par défaut
    Je viens de jeter un coup d'oeil à ta source.
    Est-ce que ça fonctionne sous tous les OS (à minima Windows 2000 et Fedora core 5)?

  8. #8
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    toutes les version *n*x oui, maintenant Windows ça fonctionne en tous cas avec cygwin je crois et MinGw...
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  9. #9
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juin 2006
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 85
    Points : 113
    Points
    113
    Par défaut
    En bidouillant, j'ai réécrit la fonction mktime pour une structure tm en GMT sans utiliser les variables d'environnement, mais c'est loin d'être performant.
    Je la mets à disposition avec un scénario de test :

    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
    #include <stdio.h>
    #include <time.h>
     
    time_t mktimeGMT(struct tm * tmGmt);
     
    int main(int argc, char** argv)
    {
     
    	time_t tDate, tDateMirror;
    	int iDate;
    	struct tm* tmLoc;
    	struct tm* tmGmt;
     
    	printf("----------------------------------------\n");
    	printf("Saisie du timestamp\n");
    	printf("----------------------------------------\n");
     
    	printf("Timestamp (<0 pour date courante) = ");
    	scanf("%d", &iDate);
    	tDate = (time_t) iDate;
    	if(tDate<0)
    	{
    		time(&tDate);
    		printf("Timestamp de la date courante = %d\n", (int)tDate);
    	}
     
    	printf("----------------------------------------\n");
    	printf("Elaboration de la structure tm en locale\n");
    	printf("----------------------------------------\n");
     
    	tmLoc = localtime(&tDate);
    	printf("Localtime = %02d/%02d/%04d %02d:%02d:%02d\n",
    			tmLoc->tm_mday, tmLoc->tm_mon+1, tmLoc->tm_year+1900,
    			tmLoc->tm_hour, tmLoc->tm_min, tmLoc->tm_sec);
     
    	printf("----------------------------------------\n");
    	printf("Recuperation du timestamp avec \"mktime\"\n");
    	printf("a partir de la structure tm en locale\n");
    	printf("----------------------------------------\n");
     
    	tDateMirror = mktime(tmLoc);
    	printf("Timestamp = %d", (int)tDateMirror);
    	if(tDateMirror == tDate)	printf(" --> OK\n");
    	else				printf(" --> NOK\n");
     
    	printf("----------------------------------------\n");
    	printf("Elaboration de la structure tm en GMT\n");
    	printf("----------------------------------------\n");
     
    	tmGmt = gmtime(&tDate);
    	printf("GMTtime = %02d/%02d/%04d %02d:%02d:%02d\n",
    			tmGmt->tm_mday, tmGmt->tm_mon+1, tmGmt->tm_year+1900,
    			tmGmt->tm_hour, tmGmt->tm_min, tmGmt->tm_sec);
     
    	printf("----------------------------------------\n");
    	printf("Recuperation du timestamp avec \"mktimeGMT\"\n");
    	printf("a partir de la structure tm en GMT\n");
    	printf("----------------------------------------\n");
     
    	tDateMirror = mktimeGMT(tmGmt);
    	printf("Timestamp = %d", (int)tDateMirror);
    	if(tDateMirror == tDate)	printf(" --> OK\n");
    	else				printf(" --> NOK\n");
     
    	return 0;
    }
     
    time_t mktimeGMT(struct tm * tmGmt)
    {
    	time_t tCurrentDate, tLoc, tGmt, tDiff, tResult;
    	struct tm tmCurrentLoc, tmCurrentGmt;
    	struct tm tmGmtSav;
     
    	/* Recuperation de la structure GMT */
    	tmGmtSav = *tmGmt;
     
    	/* Recuperation du timestamp courant */
    	time(&tCurrentDate);
     
    	/* Elaboration des structures tm en local et GMT */
    	tmCurrentLoc = *localtime(&tCurrentDate);
    	tmCurrentGmt = *gmtime(&tCurrentDate);
     
    	/* Recuperation des timestamp comme si il s'agissait */
    	/* de deux structures tm en local */
    	tLoc = mktime(&tmCurrentLoc);
    	tGmt = mktime(&tmCurrentGmt);
     
    	/* Entre les deux timestamp recuperes, on a une difference */
    	/* egale au decalage horaire */
    	tDiff = tLoc - tGmt;
     
    	/* Recuperation du timestamp de la structure qui nous */
    	/* interesse avec la fonction mktime */
    	tResult = mktime(&tmGmtSav);
     
    	/* Ajout de la difference de timestamp */
    	if(tResult != -1) tResult += tDiff;
     
    	return tResult;
    }
    Pour une date GMT inférieure au 01/01/1970 01:00:00, la fonction mktime renvoie -1 donc mktimeGMT aussi.

  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 : 67
    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 emiaille
    En bidouillant, j'ai réécrit la fonction mktime pour une structure tm en GMT.
    C'est loin d'être performant mais ça a le mérite de marcher.
    Je la mets à disposition avec un scénario de test :
    Pas du C.
    Pas de Wi-Fi à la maison : CPL

  11. #11
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juin 2006
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 85
    Points : 113
    Points
    113
    Par défaut
    Oui, j'ai utilisé la STL pour mon scénario de test, pas pour la fonction.
    J'ai réécris le code et l'ai mis à jour dans le message précédent.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2007] couleur cellule date differente si date passee, ou date du jour
    Par chris09300 dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 29/03/2011, 08h24
  2. Dates GMT et récupération en heure locale
    Par BakaOnigiri dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 04/08/2009, 18h43
  3. Convertir une date GMT en date locale
    Par olibara dans le forum C#
    Réponses: 3
    Dernier message: 01/12/2008, 23h48
  4. [Dates] Conversion heure GMT vers heure local
    Par ggjedi dans le forum Langage
    Réponses: 3
    Dernier message: 19/10/2006, 10h17
  5. []Comment convertir une date GMT en date vb ?
    Par Invité dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 11/08/2004, 16h01

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