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

Flash Pascal Discussion :

Nombre de jours depuis une date du passé


Sujet :

Flash Pascal

  1. #1
    Rédacteur/Modérateur

    Nombre de jours depuis une date du passé
    Bonjour ! Je vous présente un programme FlashPascal qui compte le nombre de jours depuis une date du passé (par exemple depuis le jour de votre naissance).

    Le programme peut être essayé en ligne.

    P.-S. Le programme utilise la version récemment corrigée de la fonction Ord(). Merci Paul !

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    if aJour1.j > NOMBRE_JOURS_PAR_MOIS[aJour1.m, Ord(Bissext(aJour1.a))] then

  2. #2
    Expert confirmé
    Mau,

    Je n'ai pas regardé ton programme, mais depuis le temps que je programme, les problèmes de ce genre sont récurrents.

    J'ai résolu ça en utilisant le calcul de dates en jours juliens (et j'ai pris l'habitude de les stocker ainsi, ce qui m'évite tous les problèmes avec les différents systèmes, qui n'utilisent pas tous la même date d'origine, alors que pour les jours juliens, c'est définit pour tout le monde).

    Dans le cas de ton programme, une fois 2 dates converties, il suffit de faire une différence.
    Le mysticisme est une maladie qui crée des problèmes là où il n’en existe pas.

  3. #3
    Rédacteur/Modérateur

    Merci pour le tuyau, droggo. Il faut que j'étudie le sujet. Si je comprends bien, il y aurait une formule qui permettrait à partir d'une date grégorienne d'obtenir une date julienne en jours, et inversement ?

  4. #4
    Expert confirmé
    Hua,

    Oui, et ça devrait être facile à trouver, j'ai fait ça aux alentours de 1980, avant de disposer d'internet.
    Le mysticisme est une maladie qui crée des problèmes là où il n’en existe pas.

  5. #5
    Rédacteur/Modérateur

    Citation Envoyé par droggo Voir le message
    Hua,

    Oui, et ça devrait être facile à trouver, j'ai fait ça aux alentours de 1980, avant de disposer d'internet.
    Effectivement, ce fut facile à trouver. J'aurai quand même un peu de regret d'abandonner mon premier algorithme, certes plus lent, mais aussi plus compréhensible.

    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
    program JourJulien;
    {$APPTYPE CONSOLE}
    {$MODE DELPHI}
     
    (*
     
      A  = Année       Entier
      M  = Mois        Entier
      Q  = Quantième   Flottant
     
      JJ = Jour julien Flottant
     
    *)
     
    function ConvDateJourJulien(A, M: integer; Q: double): double;
    var
      S: integer;
      B: integer;
    begin
      if M <= 2 then
      begin
        A := A - 1;
        M := M + 12;
      end;
      S := Trunc(A / 100);
      B := 2 - S + Trunc(S / 4);
      result := Trunc(365.25 * (A + 4716)) + Trunc(30.6001 * (M + 1)) + Q + B - 1524;
    end;
     
    procedure ConvJourJulienDate(const JJ: double; var A, M: integer; var Q: double);
    var
      Z: integer;
      F: double;
      S: integer;
      alpha: integer;
      B: integer;
      C: integer;
      D: integer;
      E: integer;
    begin
      Z := Trunc(JJ);
      F := Frac(JJ);
     
      if Z < 2299161 then
        S := Z
      else
      begin
        alpha := Trunc((Z - 1867216.25) / 36524.25);
        S := Z + 1 + alpha - Trunc(alpha / 4);
      end;
     
      B := S + 1524;
      C := Trunc((B - 122.1) / 365.25);
      D := Trunc(365.25 * C);
      E := Trunc((B - D) / 30.6001);
     
      Q := B - D - Trunc(30.6001 * E) + F;
     
      if E < 14 then
        M := E - 1
      else
        M := E - 13;
     
      if M > 2 then
        A := C - 4716
      else
        A := C - 4715;
    end;
     
    var
      A, M: integer;
      Q: double;
      JJ: double;
     
    begin
      A := 2014;
      M := 3;
      Q := 16.0;
     
      WriteLn(A);
      WriteLn(M);
      WriteLn(Q:0:2);
      WriteLn;
     
      JJ := ConvDateJourJulien(A, M, Q);
      ConvJourJulienDate(JJ, A, M, Q);
     
      WriteLn(A);
      WriteLn(M);
      WriteLn(Q:0:2);
      WriteLn;
     
      Write('Appuyez sur la touche Entr'#130'e...');
      ReadLn;
    end.

  6. #6
    Rédacteur/Modérateur

    Une version légèrement améliorée, qui donne en plus le jour de la semaine pour la date saisie sous la forme jj/mm/aaaa.

  7. #7
    Expert confirmé
    Loa,

    En fait, si tu gères également l'heure, une version vraiment améliorée serait de tenir compte du time zone, car les jours juliens ont la particularité de commencer à 12h GMT, ce qui fait que pour nous, si on fait référence à 10 h du matin, ou à 16 heures, on aura changé de jour julien.

    Cet ajout n'est pas vraiment utile pour l'usage habituel de nos programmes, mais nécessaire si on doit gérer des données dans différents pays, si on veut récupérer l'heure sans erreur.

    Le mysticisme est une maladie qui crée des problèmes là où il n’en existe pas.

  8. #8
    Rédacteur/Modérateur

    Citation Envoyé par droggo Voir le message
    Loa,

    En fait, si tu gères également l'heure, une version vraiment améliorée serait de tenir compte du time zone, car les jours juliens ont la particularité de commencer à 12h GMT, ce qui fait que pour nous, si on fait référence à 10 h du matin, ou à 16 heures, on aura changé de jour julien.

    Cet ajout n'est pas vraiment utile pour l'usage habituel de nos programmes, mais nécessaire si on doit gérer des données dans différents pays, si on veut récupérer l'heure sans erreur.

    Tout cela est bon à savoir. Merci, droggo !

###raw>template_hook.ano_emploi###