Arduino YUNでOpenWRTを使用しており、タイムサーバーで時刻を取得して、正確な日付をミリ秒単位(DD / MM / YYYY h:min:sec:ms)で取得しようとしています。
残念ながら、date +%N
%N
を返すだけです 、ただしナノ秒ではありません。 +%N
と聞きました OpenWRTの日付には含まれていません。
では、日付(ミリ秒を含む)を希望どおりに取得する方法はありますか?
承認された回答:
OpenWRTでは、date
busybox
です 、これには制限がありますが、これは厳密にはそれらの1つではありません。根本的な問題は、libc(uClibc)がこのGNUstrftime拡張機能をサポートしていないことです。 (glibcも同様ですが、以下で詳しく説明します。)
lua
が必要です デフォルトですが、他のデフォルト以外のモジュールがないと役に立ちません。
hwclock
gettimeofday()
を呼び出します RTC(ハードウェアクロック)の比較/設定用ですが、1秒未満の解像度は出力されません(RTCへのアクセスは非常に遅いため、とにかく役に立たない可能性があります)。それ以外は、OpenWRTは古代のrdate
のみを提供します 、1秒の解像度しかありません。
/proc
から直接正確なタイムスタンプを取得する簡単な方法はないようです。 、最も有用なタイムスタンプは/proc/timer_list
にあります (3行目)これはナノ秒単位の稼働時間です(解像度はプラットフォームによって異なります)。
ビジーボックスがCONFIG_BUSYBOX_CONFIG_ADJTIMEX
で構築されている場合 設定すると、adjtimex
を使用できるようになります カーネルクロックを読み取るため(ただし、busyboxバージョンには両方があることに注意してください) 標準のadjtimexに対するさまざまな引数とさまざまな出力。
通常バージョン、adjtimex -p
、出力の最後の行:
raw time: 1416419719s 146628us = 1416419719.146628
Busyboxバージョン、adjtimex
(-p
なし !)、最後の3行:
[...]
time.tv_sec: 1416420386
time.tv_usec: 732653
return value: 0 (clock synchronized)
Goldilocksは、OpenWRTクロスビルドセットアップがあることを前提とした優れたソリューションです(強くお勧めします)。
coreutils-date coreutilsはglibcに対応していますが、glibcだけではないため、ソリューションは機能します。 strftime
の独自のスタンドアロン実装が付属しています (glibcから派生)、それを使用して(strftime_case()
を介してまとめます )基になるstrftime
さまざまな拡張機能をサポートするため(それ以外の場合はuClibcバージョンにフォールバックします)。
glibc(現在の2.23まで)でさえ%N
をサポートしていません 、coreutils strftime()
正規のglibcバージョンから派生したものは%N
を追加します および%:z
と他のいくつかの変更。 strftime()
のバリエーションとパッチバージョン たくさんあります(bashとgawkのバージョンを含む)。