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のバージョンを含む)。