Arduino YUN 上 OpenWRT 上的日期(以毫秒为单位)

Tsc*_*wen 4 date openwrt busybox

我在 Arduino YUN 上使用 OpenWRT,我试图通过时间服务器获取时间来获取以毫秒为单位的确切日期(DD/MM/YYYY h:min:sec:ms)。

不幸的是date +%N只返回%N,而不是纳秒。听说+%N是不包括在OpenWRT日期的。

那么有什么方法可以获得我想要的日期(包括毫秒)吗?

mr.*_*tic 9

在 OpenWRT 上,dateisbusybox有局限性,但这并不是严格意义上的其中之一。潜在的问题是 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)也不支持%Nstrftime()从规范 glibc 版本派生的 coreutils添加了%N%:z其他一些更改。变体和修补版本strftime()比比皆是(包括 bash 和 gawk 中的版本)。

  • 谢谢。当我需要比我正在使用的构建下授予的任何这些实用程序更精细的解析时间时,`awk 'NR==3 {print $3}' /proc/timer_list` 对我来说很方便。 (2认同)

gol*_*cks 6

如果你有一个 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。

毫秒从微秒向下舍入


Tsc*_*wen 5

其实还有一个包叫coreutils-date!不知道!包括所有标准功能!