私はArduino YUNでOpenWRTを使用しており、ミリ秒(DD / MM / YYYY h:min:sec:ms)単位の正確な日付を取得するためにタイムサーバーを介して時間を取得しようとしています。
残念ながら、ナノ秒ではなくdate +%N
ナノ秒だけが返されます%N
。+%N
OpenWRTの日付は含まれていないと聞きました。
それでは、私が望む日付(ミリ秒を含む)を取得する方法はありますか?
ベストアンサー1
OpenWRTではdate
そうですbusybox
。制限がありますが、厳密に言えば、それらの1つではありません。根本的な問題はlibc(uClibc)です。この GNU strftime 拡張はサポートされていません。。 (glibcも同様ですが、これについては後で詳しく説明します。)
基本的にはあるはずlua
ですが役に立たない基本以外のモジュールもあります。
hwclock
RTC(ハードウェアクロック)を比較/設定する必要がありますgettimeofday()
が、1秒未満の解像度を出力しません(RTCにアクセスするのが遅すぎて便利ではない可能性があります)。さらに、OpenWRTは古代のrdate
1秒単位の解像度のみを提供します。
から直接正確なタイムスタンプを得るための直接的な方法はないようです/proc
。最も有用なタイムスタンプは、/proc/timer_list
ナノ秒単位の稼働時間(ライン3)です(解像度はプラットフォームによって異なります)。
ビジボックスがsetで構築されている場合は、CONFIG_BUSYBOX_CONFIG_ADJTIMEX
それを使用してカーネルクロックを読み取ることができるはずですadjtimex
(ビジボックスバージョンは両方標準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 日付coreutilsがglibcを認識しても、まったくglibcではないため、ソリューションは機能します。これには独自の独立した実装(glibcから派生)が付属しており、これを使用して基本レイヤをstrftime
ラップ(通過)してさまざまな拡張をサポートします(そうでない場合はuClibcバージョンに置き換えられます)。strftime_case()
strftime
glibc(現在2.23まで)がそれをサポートしていない場合でも、%N
正式なglibcバージョンから派生したcoreutilsはいくつかの異なる変更を追加します。バリアントとパッチのバージョンがたくさんあります(bashとgawkのバージョンを含む)。strftime()
%N
%:z
strftime()