Конвертировать в и из Unix Timestamp

8

Как лучше всего конвертировать дату, часы, минуты, секунды в метку времени Unix в миллисекундах в Arduino? Мне нужно это преобразование, так как я использую RTC (дата, часы, минуты, секунды и т. Д.) И передаю метку времени Unix через BLE

Я нашел в Интернете какой-то фрагмент кода, но пока не тестировал его.

  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;

И преобразовать в метку времени Unix:

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

Есть ли в Arduino библиотека, которая это реализует? Я бы обменял надежность на размер программы.

Джунг Нгуен
источник

Ответы:

7

Я думаю, что две наиболее часто используемые библиотеки - Adafruit RTClib и pjrc.com TimeLib . У них обоих есть функции, чтобы преобразовать эпоху, и они оба надежны. Но оба испытывают недостаток в часовом поясе и DaylightSavingTime. Я думаю, вы находите pjrc.com TimeLib чуть более подходящим для обработки времени эпохи (это 32-битный unsigned long, определенный как 'time_t').

йота
источник
+1 за TimeLib. Я использую это все время для отметок времени Unix.
Майенко
3

Существует стандартный способ сделать эти преобразования в C, который заключается в использовании функций, определенных в <time.h>. Этот API является стандартным, вы можете проверить его на своем компьютере. Последние версии avr-libc поддерживают это: см. Time.h в avr-libc . Эти функции могут обрабатывать местное время, если вы предоставляете функцию, реализующую правила DST: см set_dst(). Примеры приведены для правил США и ЕС.

Эдгар Бонет
источник
Круто, я не знал, что time.h с часовым поясом, а также летнее время были включены в Arduino. Спасибо. К сожалению, подключать чип RTC к этой системе времени нехорошо. Каждую секунду должен вызываться system_tick (). Я просто пока остаюсь с TimeLib pjrc.com.
Jot
@ Jot Это не совсем правильно. Вы можете использовать RTC для установки внутренних часов Arduino, а затем вызывать внутренние часы для получения необходимой информации о времени ... В этом случае RTC - это просто часы с батарейным питанием, которые СЛУЧАЙНО используются ... один раз за перезагрузку и, возможно, каждую неделю или две для коррекции дрейфа.
Майкл Симс
0

Вот пример для преобразования секунд (время Unix) в дату и время, используя 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

Любой полуприличный c-компилятор будет иметь набор связанных со временем типов и подпрограмм для решения этой проблемы. Консультируйтесь со своим руководством compiker для большего количества деталей.

Кстати, вопреки общепринятому мнению, вам не нужно и т.д., чтобы следить за временем. Подойдет любой хороший старый таймер плюс ваш код.

dannyf
источник
4
Большинство Arduinos отключены от керамического резонатора и поэтому плохо подходят для любого вида хронометража. Таким образом, необходимость в RTC. «Старый добрый таймер» может выполнять эту работу, только если у вас есть Arduino с кристаллом и тактовой частотой.
Эдгар Бонет
2
Кстати, «Обратитесь к руководству для составителя» на самом деле не ответ.
Эдгар Бонет