Konvertieren zu und von Unix Timestamp

8

Was ist der beste Weg, um in Arduino zwischen Datum, Stunden, Minuten, Sekunden in Unix-Zeitstempel in Millisekunden zu konvertieren? Ich muss diese Konvertierung durchführen, da ich RTC (Datum, Stunden, Minuten, Sekunden usw.) verwende und Unix-Zeitstempel über BLE kommuniziere

Ich habe einige Codes online gefunden, sie aber noch nicht ausführlich getestet.

  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;

Und um in einen Unix-Zeitstempel zu konvertieren:

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

Gibt es eine Bibliothek in Arduino, die dies implementiert? Ich würde die Zuverlässigkeit über die Größe des Programms austauschen.

Dzung Nguyen
quelle

Antworten:

7

Ich denke, dass die beiden am häufigsten verwendeten Bibliotheken die Adafruit RTClib und die pjrc.com TimeLib sind . Sie haben beide Funktionen, um die Epoche umzuwandeln, und sie sind beide zuverlässig. Beiden fehlen jedoch die Zeitzone und die DaylightSavingTime. Ich denke, Sie finden die pjrc.com TimeLib nur etwas besser geeignet, um die Epochenzeit zu handhaben (eine 32-Bit-Long ohne Vorzeichen, definiert als 'time_t').

Jot
quelle
+1 für TimeLib. Ich benutze es die ganze Zeit für Unix-Zeitstempel.
Majenko
3

Es gibt eine Standardmethode für diese Konvertierungen in C, die über die in definierten Funktionen erfolgt <time.h>. Da diese API Standard ist, können Sie sie auf Ihrem Computer testen. Neuere Versionen von avr-libc unterstützen dies: siehe time.h in avr-libc . Diese Funktionen können die Ortszeit verarbeiten, wenn Sie eine Funktion bereitstellen, die die Sommerzeitregeln implementiert: siehe set_dst(). Beispiele für US- und EU-Vorschriften werden bereitgestellt.

Edgar Bonet
quelle
Genial, ich wusste nicht, dass die 'time.h' mit Zeitzone und auch die Sommerzeit im Arduino enthalten waren. Vielen Dank. Einen RTC-Chip mit diesem Zeitsystem zu verbinden ist leider nicht schön. Jede Sekunde sollte ein system_tick () aufgerufen werden. Ich bleibe vorerst bei der pjrc.com TimeLib.
Jot
@Jot Das ist nicht ganz richtig. Sie können eine RTC verwenden, um die interne Uhr des Arduino einzustellen, und dann die interne Uhr aufrufen, um die erforderlichen Zeitinformationen zu erhalten. In diesem Fall handelt es sich lediglich um eine batteriegepufferte Uhr, die gelegentlich verwendet wird ... einmal pro Neustart und möglicherweise jede oder jede zweite Woche zur Driftkorrektur.
Michael Sims
0

Hier ist ein Beispiel zum Konvertieren von Sekunden (Unix-Zeit) in Datum und Uhrzeit mithilfe von 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
quelle
-6

Jeder halbwegs anständige c-Compiler hätte eine Reihe von zeitbezogenen Typen und Routinen, um damit umzugehen. Weitere Einzelheiten finden Sie in Ihrem Compiker-Handbuch.

Übrigens, im Gegensatz zu herkömmlicher Weisheit, brauchen Sie kein usw., um die Zeit im Auge zu behalten. Jeder gute ältere Timer und Ihr Code reichen aus.

dannyf
quelle
4
Die meisten Arduinos werden von einem Keramikresonator getaktet und sind daher für jede Art von Zeitmessung schlecht geeignet. Daher die Notwendigkeit einer RTC. Der „gute ältere Timer“ kann die Arbeit nur erledigen, wenn Sie einen Arduino mit Kristalluhr haben.
Edgar Bonet
2
Übrigens ist "Konsultieren Sie Ihr Compiker-Handbuch" keine wirkliche Antwort.
Edgar Bonet