Používám OpenWRT na Arduino YUN a snažím se získat přesné datum v milisekundách (DD/MM/RRRR h:min:sec:ms) získáním času časovým serverem.
Bohužel date +%N
vrátí pouze %N
, ale ne nanosekundy. Slyšel jsem +%N
není zahrnuto v datu OpenWRT.
Existuje tedy nějaký způsob, jak získat datum (včetně milisekund), jak ho chci?
Přijatá odpověď:
Na OpenWRT date
je busybox
, který má omezení, ale toto není striktně jedno z nich. Základním problémem je, že knihovna libc (uClibc) nepodporuje toto rozšíření GNU strftime. (Ačkoli ani glibc, více o tom níže.)
Měli byste mít lua
ve výchozím nastavení, ale to nepomůže bez některých dalších nevýchozích modulů.
hwclock
volá gettimeofday()
pro porovnávání/nastavení RTC (hardwarové hodiny), ale nebude mít na výstupu subsekundové rozlišení (přístup k RTC může být dostatečně pomalý, takže stejně nemusí být užitečný). Kromě toho OpenWRT poskytuje pouze staré rdate
, který má pouze celosekundové rozlišení.
Zdá se, že neexistuje žádný přímý způsob, jak získat přesné časové razítko přímo z /proc
, nejužitečnější časové razítko je v /proc/timer_list
(3. řádek), což je doba provozuschopnosti v nanosekundách (rozlišení bude záviset na platformě).
Pokud byl váš busybox vytvořen pomocí CONFIG_BUSYBOX_CONFIG_ADJTIMEX
set, pak byste měli být schopni použít adjtimex
pro čtení hodin jádra (i když si uvědomte, že verze busybox má obě různé argumenty a jiný výstup do standardního adjtimex.
Normální verze, adjtimex -p
, poslední řádek výstupu:
raw time: 1416419719s 146628us = 1416419719.146628
Verze Busybox, adjtimex
(bez -p
!), poslední 3 řádky:
[...]
time.tv_sec: 1416420386
time.tv_usec: 732653
return value: 0 (clock synchronized)
Goldilocks's je skvělé řešení, za předpokladu, že máte nastavení OpenWRT cross build (důrazně doporučujeme!).
Vaše coreutils-date řešení funguje, protože zatímco coreutils si je vědom glibc, není to výhradně glibc. Dodává se s vlastní samostatnou implementací strftime
(odvozeno z glibc) a používá to k uzavření (prostřednictvím strftime_case()
) základní strftime
tak, aby podporoval různá rozšíření (a jinak se vrátí k verzi uClibc).
Dokonce ani glibc (až do aktuální verze 2.23) nepodporuje %N
, coreutils strftime()
odvozené z kanonické verze glibc přidává %N
a %:z
a několik dalších změn. Variace a opravené verze strftime()
přetékají (včetně verzí v bash a gawk).