Unixタイムスタンプとの相互変換

Arduinoで日付、時間、分、秒をUnixタイムスタンプ(ミリ秒)に変換する最善の方法は何でしょうか?私はRTC(日付、時間、分、秒など)を使用しており、BLEを介してUnixタイムスタンプを通信しているため、この変換を行う必要があります。

私はいくつかのコードのスニペットをオンラインで見つけましたが、まだ広範囲にテストしていません。

  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のライブラリはないでしょうか?プログラムの大きさと信頼性をトレードオフにしたいのですが。

よく使われるライブラリは、Adafruit RTClibpjrc.com TimeLib の2つではないかと思います。 どちらもエポック変換の関数を持っていて、信頼性が高いです。しかし、どちらもタイムゾーンとDaylightSavingTimeが不足しています。 pjrc.com TimeLibは、エポックタイム(これは 'time_t' として定義される32ビット符号なし長)を処理するのに、ほんの少し適していることがわかると思うのです。

解説 (1)

C言語では,これらの変換を行う標準的な方法があります。 で定義された関数を使うことです。このAPIは標準的なものです。 で定義されている関数を使います。最近のバージョンのavr-libcはこれをサポートしています。 はこれをサポートしています: time.h in avr-libc を参照してください。これらの関数は DST 規則を実装した関数を提供すれば、これらの関数はローカルタイムを扱うことができます。 set_dst()を参照してください。set_dst() を参照してください。USとEUのルールの例が提供されています。

解説 (2)

まともなCコンパイラなら、時間に関連する型やルーチンのセットを用意しているはずです。より詳細については、コンパイラーのマニュアルを参照してください。

ところで、従来の常識に反して、時間を記録するためにetc.は必要ありません。古いタイマーとあなたのコードで十分です。

解説 (2)