Converti da e verso Unix Timestamp


8

Qual è il modo migliore per convertire tra data, ore, min, secondi in timestamp Unix in millisecondi in Arduino? Devo avere questa conversione, poiché sto usando RTC (data, ore, minuti, secondi ecc.) E sto comunicando il timestamp Unix su BLE

Ho trovato alcuni frammenti di codici online, ma non l'ho ancora testato ampiamente.

  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;

E per convertire in timestamp Unix:

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

C'è qualche libreria in Arduino che implementa questo? Vorrei compromettere l'affidabilità rispetto alle dimensioni del programma.

Risposte:


7

Penso che le due librerie più utilizzate siano Adafruit RTClib e pjrc.com TimeLib . Entrambi hanno funzioni per convertire l'epoca ed entrambi sono affidabili. Ma entrambi mancano del fuso orario e dell'ora legale. Penso che il TimeLib di pjrc.com sia leggermente più adatto a gestire il tempo dell'epoca (che è un unsigned a 32 bit definito da tempo come 'time_t').


+1 per TimeLib. Lo uso sempre per i timestamp unix.
— Majenko

3

C'è un modo standard di fare quelle conversioni in C, che è attraverso le funzioni definite in <time.h>. Essendo questa API standard, puoi provarla sul tuo computer. Le versioni recenti di avr-libc supportano questo: vedere time.h in avr-libc . Queste funzioni possono gestire l'ora locale se si fornisce una funzione che implementa le regole dell'ora legale: vedere set_dst(). Esempi sono forniti per le norme statunitensi e comunitarie.


Fantastico, non sapevo che il "time.h" con fuso orario e l'ora legale fossero inclusi con l'Arduino. Grazie. Collegare un chip RTC con quel sistema temporale non è purtroppo bello. Ogni secondo dovrebbe essere chiamato un system_tick (). Sto solo con il TimeLib pjrc.com per ora.
— Jot

@Jot Non è del tutto corretto. È possibile utilizzare un RTC per impostare l'orologio interno di Arduino, quindi chiamare l'orologio interno per le informazioni sul tempo necessarie ... RTC in tal caso è semplicemente un orologio con batteria che viene utilizzato OCCASIONALMENTE ... una volta per riavvio e possibilmente ogni settimana o due per la correzione della deriva.
— Michael Sims,

0

Ecco un esempio per convertire i secondi (ora Unix) in Data e ora utilizzando 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() {



}

-6

Qualsiasi compilatore C decente avrebbe una serie di tipi e routine relativi al tempo per far fronte a questo. Consultare il manuale del compiker per ulteriori dettagli.

A proposito, contrariamente alla saggezza convenzionale, non è necessario un ecc per tenere traccia del tempo. Qualsiasi buon vecchio timer più il tuo codice farà.


4
La maggior parte degli Arduinos ha un risonatore in ceramica, quindi non è adatta a qualsiasi tipo di cronometraggio. Quindi la necessità di un RTC. Il "buon vecchio timer" può fare il lavoro solo se si dispone di un Arduino con clock di cristallo.
— Edgar Bonet,

2
A proposito, "Consultare il manuale del compiker" non è davvero una risposta.
— Edgar Bonet,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.