Go Down

Topic: nombre de secondes depuis une date (Read 3485 times) previous topic - next topic

Papydroid

bonjour,
je cherche à déterminer le nombre de seconde entre une date référence et la date présente. Je penser trouver facilement une librairie ou une fonction en C mais rien.
Quelqu'un pourrait-il me donner un tuyau.
Merci.
PS j'utilise un module RTC PCF8583

icare

Bonjour,
Regarde sur le net avec le "Jour Julien"
2B OR NOT(2B) = FF
Arduino 1.0.5 à 1.8.5 + gEdit + Ubuntu 18.04 LTS

bricoleau

#2
Apr 23, 2015, 11:57 pm Last Edit: Apr 24, 2015, 12:04 am by bricoleau
Salut Papy

Quand on manipule des dates ou temps en programmation, le plus efficace est de convertir tout ça en un simple nombre entier, bien plus pratique pour effectuer des calculs.

On appelle ça un timestamp.

Par exemple, prenons comme référence le 1er janvier 2000 à 0h00, et exprimons tout horodatage en nombre de secondes écoulées depuis cette référence.

Un entier long non signé (codé sur 4 octets) peut ainsi représenter toute date/heure, à la seconde près, comprise entre le 1er janvier 2000 0h00 et quelque part aux alentours de l'an 2130.
C'est-à-dire assez loin pour que nous n'ayons pas à nous préoccuper de ce qui se passera quand notre petit arduino y arrivera.

Voici donc deux fonctions de calcul "simples".

La première calcule le timestamp à partir d'une date et d'une heure.
La seconde fait l'opération inverse : calcul de la date et d'une heure à partir d'un timestamp.

Dans ton cas, il te suffit de calculer le timestamp associé à ta date de référence, puis celui associé à la date ou à l'instant présent, et faire la différence entre les deux.
Cette différence sera bien le nombre de secondes écoulées entre les deux instants.

Code: [Select]
#define NB_JOURS_ANNEES_PRECEDENTES(a) (((a)*365) + (((a)+3)>>2))
#define PAS_BISSEXTILE(a) ((a)&3)

uint32_t calculerTimestamp(uint8_t a, uint8_t m, uint8_t j, uint8_t hh, uint8_t mm, uint8_t ss)
{
  uint32_t nbjours;

  nbjours = NB_JOURS_ANNEES_PRECEDENTES(a);

  switch (m)
  {
    case  2 : nbjours +=  31; break;
    case  3 : nbjours +=  59; break;
    case  4 : nbjours +=  90; break;
    case  5 : nbjours += 120; break;
    case  6 : nbjours += 151; break;
    case  7 : nbjours += 181; break;
    case  8 : nbjours += 212; break;
    case  9 : nbjours += 243; break;
    case 10 : nbjours += 273; break;
    case 11 : nbjours += 304; break;
    case 12 : nbjours += 334; break;
  }

  if ((m < 3) || PAS_BISSEXTILE(a))
  {
    nbjours += j - 1;
  }
  else // le 29/02 est passé
  {
    nbjours += j;
  }

  return (uint32_t) ss + (60*(mm + (60*(hh + (24*nbjours)))));
}

void decomposerTimestamp(uint32_t ts, uint8_t *a, uint8_t *m, uint8_t *j, uint8_t *hh, uint8_t *mm, uint8_t *ss)
{
  uint32_t li;
  uint16_t deb, fin;
  uint8_t i;

  li = ts / 86400;
  *a = (li - ((li + 1401) / 1461)) / 365;

  li = li + 1 - NB_JOURS_ANNEES_PRECEDENTES(*a);
  fin = 0;
  for (i=1; i<=12; i++)
  {
    deb = fin;
    switch (i)
    {
      case  2 :
        fin += 28 + (!PAS_BISSEXTILE(*a));
        break;
      case  4 :
      case  6 :
      case  9 :
      case 11 :
        fin += 30;
        break;
      default :
        fin += 31;
        break;
    }
    if (fin >= li)
    {
      *m = i;
      *j = li - deb;
      i = 12;
    }
  }

  li  = ts % 86400;
  *hh = li / 3600;
  li  = li % 3600;
  *mm = li / 60;
  *ss = li % 60;
}


Ces fonctions manipulent l'année sur deux chiffres (00 => 2000, 01 => 2001, ...).

J'imagine que des fonctions équivalentes se trouvent en cherchant sur le net.
Personnellement j'ai trouvé plus rigolo de les coder moi-même.
Je les ai testées par programme, pour chaque instant compris entre le 01/01/2000 0:00:00 et le 31/12/2099 23:59:59
Tutoriels arduino : http://forum.arduino.cc/index.php?topic=398112.0

infobarquee

Quote
1er janvier 2000 0h00
bonjour,
non, c'est 1/1/1970 à 0:0:0 et non 2000 la date référence
AUCUNE AIDE PAR MP

bricoleau

Exact

En fait, je me suis aligné sur le périmètre d'usage d'un ds1307, ultra classique dans notre petit monde.

Précision à la seconde, et période gérée limitée au XXI siècle
Tutoriels arduino : http://forum.arduino.cc/index.php?topic=398112.0


XavierMiller

#6
Apr 24, 2015, 01:19 pm Last Edit: Apr 24, 2015, 01:21 pm by XavierMiller
http://en.cppreference.com/w/c/chrono/time
Pepe, en C, la référence est bien celle d'UNIX ;)

alaindepicardie

#7
Mar 24, 2018, 02:55 am Last Edit: Mar 24, 2018, 02:57 am by alaindepicardie
bonjour
@Bricoleau
j'essaie d'utiliser tes fonctions, mais je n'ai sans doute pas compris car ce qui m'est retourné n'est pas ce que j'attend.

Je rentre:
Serial.print (calculerTimestamp(01,2,15,12,30,45)); (15/2/2001-12H 30mn 45S)

j'obtiens:
le 15/2/1971 à 13:30:45
   
si je remplace ma ligne part:
Serial.print (calculerTimestamp(47,2,15,12,30,45));
47 c'est 2018-1971

j'obtiens
le 15/2/2017 à 13:30:45

juste une heure d'écart par rapport a ce que me donne cette page:(sans doute des histoires de UTC)
http://www.timestamp.fr/?

pourtant tu dit:
Quote
Ces fonctions manipulent l'année sur deux chiffres (00 => 2000, 01 => 2001, ...).
ou est ce que je n'ai pas compris?
Merci par avance. Alain


biggil

On trouve ça tout fait dans la librairie RTClib.
Voir les classes DateTime et TimeSpan.
Aide toi, le compilateur t'aidera

Go Up