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 :

Trouver le jour précédent


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 32
    Par défaut Trouver le jour précédent
    Bonjour,

    Résumé :
    Je cherche à déterminer le jour précédent au jour en cours, afin de faire une sauvegarde périodique des données de la journée qui vient de s'écouler. La logique de la solution trouvée n'aboutit cependant pas au résultat escompté

    Description du besoin :
    Imaginons que durant le jour J du mois M de l'année Y, des données soient mises à jour périodiquement.
    Dès que nous passant au jour suivant (J+1), le code doit appeler une nouvelle fonction pour sauver les données du jour J dans un fichier.
    Pour cela, le jour J+1 doit déterminer quelle était la valeur du jour J.
    Chaque mois n'étant pas identique, parfois, 28, 29, 30 ou 31 jours, il faut bien manipuler les dates pour ne pas se tromper.

    Ce qui est sensé marcher, mais qui ne marche PAS :
    Voilà, j'ai fait une petite routine qui cherche à tronquer 24h à la date actuelle (J+1). Pour cela, je cherche le temps écoulé en secondes depuis le 1/1/70, je retire les 24h (en secondes) et je converti en date et heure afin de récupérer le jour correspondant.
    Sur le principe, c'est logique, mais la réalité me retourne TOUJOURS le jour J+1 au lieu de J !!

    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
     
    #include <windows.h>
    #include <stdio.h>
    #include <time.h>
     
    #define	ONEDAY (60 * 60 * 24)		// 1 day in seconds
     
    	int    		outtim	 // Output data.
    	struct tm*	timeinfo;
    	time_t	time_cur;
     
    	// Get current time as seconds elapsed since midnight, January 1, 1970
    	time(&time_cur);
    	// Remove 1 day
    	time_cur -= ONEDAY;
    	// Convert updated time into numeric time format
    	timeinfo = localtime(&time_cur);
    	// Get day of corrected time (yesterday)
    	outtim = timeinfo->tm_mday;
    	// Return expected previous day
    	return outtim;
    Donc, la routine est appelé le jour J+1 (dès le changement de date de J à J+1) et malheureusement, je retrouve dans timeinfo->tm_mday la valeur de J+1 et non de J comme attendue !

    Si quelqu'un à une idée de la où j'ai cafouillé...

    Merci par avance,
    T

  2. #2
    Membre chevronné
    Inscrit en
    Décembre 2010
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 290
    Par défaut
    Ben écoute j'ai essayé ce code tel quel (en l'encapsulant dans une fonction) chez moi et ça marche. outtim vaut bien 4, et on est le 5 mars.
    Je me demande toutefois ce qui se passe à minuit pile.

  3. #3
    Expert confirmé

    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
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par trobin Voir le message
    Donc, la routine est appelé le jour J+1 (dès le changement de date de J à J+1) et malheureusement, je retrouve dans timeinfo->tm_mday la valeur de J+1 et non de J comme attendue !
    Pourtant c'est pas bien compliqué :


    Tu utilises time pour trouver le jour en cours.

    Tu enlèves 86400.

    Tu utilises localtime pour obtenir le jour...

    Sachant que :

    mktime

    tm_mday Le quantième du mois, dans l'intervalle 1 à 31.
    tm_mon Le nombre de mois écoulés depuis le début de l'année, dans l'intervalle 0 à 11.
    Il faut donc rajouter 1 à tm_mon pour avoir le vrai mois..

  4. #4
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 32
    Par défaut
    Merci à vous deux, phi1981 pour avoir testé le code, et souviron34 pour avoir fait de l'ironie.

    je viens de revoir le code entier, principalement celui en amont (non copié ici) et j'ai trouvé mon erreur, enfin une erreur.

    En réalité, outtim est un argument de la fonction (ci-dessus, le bout de code a été repris pour simplifier et donner un code opérationnel sans besoin de savoir ce qu'il y a avant), le souci est la façon dont j'ai écrit le bazar. J'aurai dû passer l'adresse de outtim, ce que je n'ai pas fait. Donc, ma connerie.
    Mais, et oui il y a un 'mais', l'erreur sur l'argument devrait retourner 0 (valeur d'initialisation avant l'appel de la fonction dont le code est ci-dessus), pourtant je récupère J+1 au lieu de J...

    @ phi1981 : A minuit pile poil de J+1 tu devrais obtenir le minuit pile poil du jour J, c'est la raison pour laquelle j'ai défini ONEDAY à exactement 60*60*24, pas une seconde de plus ni une seconde de moins. En effet, la fonction est sensée agir au changement de date, mais aussi au démarrage de l'exe contenant les fonctions de logs et de temps comme celle-ci.

  5. #5
    Expert confirmé

    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
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par trobin Voir le message
    Merci à souviron34 pour avoir fait de l'ironie.
    Euh.. Je n'ai pas du tout fait de l'ironie, ou alors tu es extrêmement susceptible : j'ai donné la solution..

    Citation Envoyé par trobin Voir le message
    c'est la raison pour laquelle j'ai défini ONEDAY à exactement 60*60*24
    qui est exactement le 86400 que j'ai donné dans mon post

Discussions similaires

  1. Trouver la date du jour précédent
    Par yoaugoulo dans le forum Développement de jobs
    Réponses: 4
    Dernier message: 07/01/2010, 12h15
  2. Trouver le jour de l'année à partir de son numéro
    Par Nounours666 dans le forum C++Builder
    Réponses: 7
    Dernier message: 09/01/2006, 13h20
  3. [vbexcel]trouver le jour a partir d'une date.
    Par Mugette dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 08/12/2005, 16h07
  4. [D7] trouver un jour a partir d'une semaine et date
    Par raoulmania dans le forum Langage
    Réponses: 4
    Dernier message: 01/12/2005, 11h43
  5. HTML URL trouver l'URL précédente précédente
    Par carolinebelle dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 29/07/2005, 17h22

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