Convertir vers et depuis l'horodatage Unix

8

Quelle est la meilleure façon de convertir la date, les heures, les minutes et les secondes en horodatage Unix en millisecondes dans Arduino? J'ai besoin de cette conversion, car j'utilise RTC (date, heures, min, secondes, etc.) et communique l'horodatage Unix sur BLE

J'ai trouvé un extrait de code en ligne, mais je ne l'ai pas encore testé de manière approfondie.

  byte second = epoch%60; epoch /= 60;
  byte minute = epoch%60; epoch /= 60;
  byte hour   = epoch%24; epoch /= 24;

  unsigned int years = epoch/(365*4+1)*4; epoch %= 365*4+1;
  unsigned int year;
  for (year=3; year>0; year--)
  {
      if (epoch >= days[year][0])
          break;
  }

  unsigned int month;
  for (month=11; month>0; month--)
  {
      if (epoch >= days[year][month])
          break;
  }

  year  = years+year;
  month = month+1;
  unsigned int day   = epoch - days[year][month]+1;

  unsigned int weekday  = (dayOfMonth += month < 3 ? year-- : year - 2, 23*month/9 + dayOfMonth + 4 + year/4- year/100 + year/400)%7;

Et pour convertir en horodatage Unix:

unsigned long epoch = (((year/4*(365*4+1)+days[year%4][month]+dayOfMonth)*24+hour)*60+minute)*60+second;

Existe-t-il une bibliothèque dans Arduino qui implémente cela? J'échangerais la fiabilité sur la taille du programme.

Dzung Nguyen
la source

Réponses:

7

Je pense que les deux bibliothèques les plus utilisées sont Adafruit RTClib et pjrc.com TimeLib . Ils ont tous deux des fonctions pour convertir l'époque, et ils sont tous deux fiables. Mais les deux n'ont pas le fuseau horaire et le DaylightSavingTime. Je pense que vous trouvez le pjrc.com TimeLib juste un peu plus approprié pour gérer le temps de l'époque (qui est un 32 bits non signé long défini comme 'time_t').

Iota
la source
+1 pour TimeLib. Je l'utilise tout le temps pour les horodatages Unix.
Majenko
3

Il existe une méthode standard pour effectuer ces conversions en C, à travers les fonctions définies dans <time.h>. Cette API étant standard, vous pouvez la tester sur votre ordinateur. Les versions récentes de avr-libc le supportent: voir time.h dans avr-libc . Ces fonctions peuvent gérer l'heure locale si vous fournissez une fonction implémentant les règles DST: voir set_dst(). Des exemples sont fournis pour les règles américaines et européennes.

Edgar Bonet
la source
Génial, je ne savais pas que le 'time.h' avec le fuseau horaire et également l'heure d'été étaient inclus avec l'Arduino. Merci. Pour connecter une puce RTC avec ce système de temps n'est malheureusement pas agréable. Chaque seconde, un system_tick () doit être appelé. Je reste avec le TimeLib de pjrc.com pour l'instant.
Jot
@Jot Ce n'est pas tout à fait correct. Vous pouvez utiliser un RTC pour régler l'horloge interne de l'Arduino, puis appeler l'horloge interne pour les informations de temps nécessaires ... Le RTC dans ce cas est simplement une horloge alimentée par batterie qui est OCCASIONNELLEMENT utilisée ... une fois par redémarrage et éventuellement toutes les semaines ou deux pour la correction de dérive.
Michael Sims
0

Voici un exemple pour convertir des secondes (heure Unix) en date et heure en utilisant TimeLib.h:

#include <TimeLib.h>

unsigned long offset_days = 3;    // 3 days
unsigned long t_unix_date1, t_unix_date2;

void setup() {
  Serial.begin(115200);
  t_unix_date1 = 1564398600;
  Serial.print("t_unix_date1: ");
  Serial.println(t_unix_date1);
  offset_days = offset_days * 86400;    // convert number of days to seconds
  t_unix_date2 = 1564398600 + offset_days;
  Serial.print("t_unix_date2: ");
  Serial.println(t_unix_date2);
  printf("Date1: %4d-%02d-%02d %02d:%02d:%02d\n", year(t_unix_date1), month(t_unix_date1), day(t_unix_date1), hour(t_unix_date1), minute(t_unix_date1), second(t_unix_date1));
  printf("Date2: %4d-%02d-%02d %02d:%02d:%02d\n", year(t_unix_date2), month(t_unix_date2), day(t_unix_date2), hour(t_unix_date2), minute(t_unix_date2), second(t_unix_date2));
}

void loop() {



}
Ivan
la source
-6

Tout compilateur c à moitié décent aurait un ensemble de types et de routines liés au temps pour gérer cela. Consultez votre manuel compiker pour plus de détails.

Btw, contrairement à la sagesse conventionnelle, vous n'avez pas besoin d'un etc pour suivre le temps. Toute bonne minuterie plus ancienne et votre code feront l'affaire.

dannyf
la source
4
La plupart des Arduinos sont cadencés sur un résonateur en céramique et sont donc mal adaptés à tout type de chronométrage. D'où la nécessité d'un RTC. Le «bon vieux minuteur» ne peut faire le travail que si vous avez un Arduino à quartz.
Edgar Bonet
2
BTW, "Consulter votre manuel compiker" n'est pas vraiment une réponse.
Edgar Bonet