Tsc*_*wen 4 date openwrt busybox
我在 Arduino YUN 上使用 OpenWRT,我试图通过时间服务器获取时间来获取以毫秒为单位的确切日期(DD/MM/YYYY h:min:sec:ms)。
不幸的是date +%N
只返回%N
,而不是纳秒。听说+%N
是不包括在OpenWRT日期的。
那么有什么方法可以获得我想要的日期(包括毫秒)吗?
在 OpenWRT 上,date
isbusybox
有局限性,但这并不是严格意义上的其中之一。潜在的问题是 libc (uClibc)不支持这个 GNU strftime 扩展。(虽然 glibc 也没有,下面有更多内容。)
lua
默认情况下您应该拥有,但是如果没有其他一些非默认模块,那将无济于事。
hwclock
要求gettimeofday()
比较/设置 RTC(硬件时钟),但它不会输出亚秒级分辨率(访问 RTC 的速度可能足够慢,以至于它无论如何都可能没有用)。除此之外,OpenWRT 只提供古代的rdate
,它只有整秒的分辨率。
似乎没有直接从 获得准确时间戳的直接方法/proc
,最有用的时间戳在/proc/timer_list
(第 3 行)中,这是以纳秒为单位的正常运行时间(分辨率将取决于平台)。
如果你的busybox与建CONFIG_BUSYBOX_CONFIG_ADJTIMEX
组,那么你应该能够使用adjtimex
读取内核时钟(但要注意的是,busybox的版本有两种不同的参数和不同的输出到标准adjtimex。
普通版,adjtimex -p
最后一行输出:
raw time: 1416419719s 146628us = 1416419719.146628
Run Code Online (Sandbox Code Playgroud)
Busybox 版本,adjtimex
(没有-p
!),最后 3 行:
[...]
time.tv_sec: 1416420386
time.tv_usec: 732653
return value: 0 (clock synchronized)
Run Code Online (Sandbox Code Playgroud)
Goldilocks 是一个很好的解决方案,假设您有 OpenWRT 交叉构建设置(强烈推荐!)。您的coreutils-date解决方案有效,因为虽然 coreutils 是 glibc 感知的,但它并不完全是 glibc。它带有自己的strftime
(源自 glibc)的独立实现,并使用它来包装(通过strftime_case()
)底层strftime
以支持各种扩展(否则回退到 uClibc 版本)。
甚至 glibc(直到当前 2.23)也不支持%N
,strftime()
从规范 glibc 版本派生的 coreutils添加了%N
和%:z
其他一些更改。变体和修补版本strftime()
比比皆是(包括 bash 和 gawk 中的版本)。
如果你有一个 C 编译器并且找不到其他任何东西,这将报告,例如
> millitime && sleep 1 && millitime
14/11/2014 9:39:49:364
14/11/2014 9:39:50:368
Run Code Online (Sandbox Code Playgroud)
> millitime && sleep 1 && millitime
14/11/2014 9:39:49:364
14/11/2014 9:39:50:368
Run Code Online (Sandbox Code Playgroud)
使用 gcc,只需编译它gcc whatever.c -o millitime
。如果有错误(这会很奇怪),它会向 stderr 报告并以状态 1 退出。否则它会向 stdout 报告并退出 0。
毫秒从微秒向下舍入。
归档时间: |
|
查看次数: |
7795 次 |
最近记录: |