Ich verwende OpenWRT auf dem Arduino YUN und versuche, das genaue Datum in Millisekunden (TT/MM/JJJJ h:min:sek:ms) zu erhalten, indem ich die Zeit von einem Zeitserver erhalte.
Leider date +%N
gibt nur %N
zurück , aber nicht die Nanosekunden. Ich habe +%N
gehört ist nicht im OpenWRT-Datum enthalten.
Gibt es also eine Möglichkeit, das Datum (einschließlich Millisekunden) so zu erhalten, wie ich es möchte?
Akzeptierte Antwort:
Auf OpenWRT, date
ist busybox
, das Einschränkungen hat, aber dies ist streng genommen keine davon. Das zugrunde liegende Problem ist, dass die libc (uClibc) diese GNU strftime-Erweiterung nicht unterstützt. (Allerdings glibc auch nicht, mehr dazu weiter unten.)
Sie sollten lua
haben standardmäßig, aber das hilft nicht ohne einige andere nicht standardmäßige Module.
hwclock
ruft gettimeofday()
auf zum Vergleichen/Einstellen der RTC (Hardware-Uhr), aber es wird keine Auflösung von weniger als einer Sekunde ausgegeben (der Zugriff auf RTCs kann langsam genug sein, dass es sowieso nicht nützlich sein könnte). Ansonsten stellt OpenWRT nur das alte rdate
zur Verfügung , die nur eine Auflösung von ganzen Sekunden hat.
Es scheint keine einfache Möglichkeit zu geben, einen genauen Zeitstempel direkt aus /proc
zu erhalten , befindet sich der nützlichste Zeitstempel in /proc/timer_list
(3. Zeile), das ist die Betriebszeit in Nanosekunden (die Auflösung hängt von der Plattform ab).
Wenn Ihre Busybox mit CONFIG_BUSYBOX_CONFIG_ADJTIMEX
gebaut wurde gesetzt, dann sollten Sie in der Lage sein, adjtimex
zu verwenden um die Kernel-Uhr zu lesen (beachten Sie jedoch, dass die Busybox-Version beides hat andere Argumente und andere Ausgabe als der Standard adjtimex.
Normale Version, adjtimex -p
, letzte Zeile der Ausgabe:
raw time: 1416419719s 146628us = 1416419719.146628
Busybox-Version, adjtimex
(ohne -p
!), letzten 3 Zeilen:
[...]
time.tv_sec: 1416420386
time.tv_usec: 732653
return value: 0 (clock synchronized)
Das von Goldilocks ist eine gute Lösung, vorausgesetzt, Sie haben Ihr OpenWRT-Cross-Build-Setup (dringend empfohlen!).
Ihr coreutils-Datum Die Lösung funktioniert, weil coreutils zwar glibc-fähig ist, aber nicht ausschließlich glibc. Es wird mit einer eigenen eigenständigen Implementierung von strftime
geliefert (abgeleitet von glibc) und verwendet dies zum Abschluss (über strftime_case()
). ) die zugrunde liegende strftime
um verschiedene Erweiterungen zu unterstützen (und greift ansonsten auf die uClibc-Version zurück).
Selbst glibc (bis zur aktuellen Version 2.23) unterstützt %N
nicht , die Coreutils strftime()
abgeleitet von der kanonischen glibc-Version fügt %N
hinzu und %:z
und ein paar andere Änderungen. Variationen und gepatchte Versionen von strftime()
gibt es zuhauf (einschließlich Versionen in bash und gawk).