.png)
Arduino YUN에서 OpenWRT를 사용하고 있으며 타임서버를 통해 시간을 가져와서 정확한 날짜를 밀리초(DD/MM/YYYY h:min:sec:ms) 단위로 얻으려고 합니다.
불행하게도 date +%N
단지 반환 %N
하지만 나노초는 반환하지 않습니다. +%N
OpenWRT 날짜에는 포함되지 않는다고 들었습니다 .
그렇다면 내가 원하는 날짜(밀리초 포함)를 얻을 수 있는 방법이 있나요?
답변1
OpenWRT에서는 제한이 date
있지만 busybox
엄밀히 말하면 그 중 하나는 아닙니다. 근본적인 문제는 libc(uClibc)가이 GNU strftime 확장을 지원하지 않습니다. (glibc도 마찬가지지만 이에 대해서는 아래에서 자세히 설명합니다.)
기본적으로 있어야 lua
하지만도움이 되지 않습니다다른 기본이 아닌 모듈 없이.
hwclock
RTC(하드웨어 시계)를 비교/설정 해야 gettimeofday()
하지만 1초 미만의 해상도를 출력하지 않습니다(RTC에 액세스하는 것은 어쨌든 유용하지 않을 정도로 느릴 수 있습니다). 그 외에 OpenWRT는 rdate
전체 초 해상도만 지원하는 고대 버전만 제공합니다.
에서 직접 정확한 타임스탬프를 얻을 수 있는 간단한 방법은 없는 것 같습니다 /proc
. 가장 유용한 타임스탬프는 /proc/timer_list
나노초 단위의 가동 시간인 (세 번째 줄)입니다(해상도는 플랫폼에 따라 다름).
비지박스가 세트로 구축된 경우 커널 시계를 읽는 데 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)
OpenWRT 크로스 빌드 설정이 있다고 가정하면 Goldilocks는 훌륭한 솔루션입니다(강력히 권장됩니다!). 당신의coreutils 날짜coreutils는 glibc를 인식하지만 glibc만 인식하는 것은 아니기 때문에 솔루션이 작동합니다. 이는 (glibc에서 파생된) 자체 독립 실행형 구현과 함께 제공되며 이를 사용하여 다양한 확장을 지원하기 위해 기본을 strftime
마무리합니다 (그렇지 않으면 uClibc 버전으로 대체).strftime_case()
strftime
glibc(현재 2.23까지)도 를 지원하지 않으며 , 정식 glibc 버전에서 파생된 %N
coreutils가 추가 되고 몇 가지 다른 변경 사항이 추가되었습니다. 다양한 변형 및 패치 버전이 있습니다(bash 및 gawk 버전 포함).strftime()
%N
%:z
strftime()
답변2
C 컴파일러가 있고 다른 것을 찾을 수 없다면 다음과 같이 보고됩니다.
> millitime && sleep 1 && millitime
14/11/2014 9:39:49:364
14/11/2014 9:39:50:368
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <sys/time.h>
#include <time.h>
int main (void) {
struct timeval now;
struct tm *parsed;
if (gettimeofday(&now, NULL) == -1) {
fprintf (
stderr,
"gettimeofday() failed: %s\n",
strerror(errno)
);
return 1;
}
parsed = localtime((const time_t*)&now.tv_sec);
if (!parsed) {
fprintf (
stderr,
"localtime() failed: %s\n",
strerror(errno)
);
return 1;
}
printf (
"%d/%d/%d %d:%02d:%02d:%03d\n",
parsed->tm_mday,
parsed->tm_mon + 1,
parsed->tm_year + 1900,
parsed->tm_hour,
parsed->tm_min,
parsed->tm_sec,
now.tv_usec / 1000
);
return 0;
}
gcc를 사용하여 컴파일하면 됩니다 gcc whatever.c -o millitime
. 오류(매우 이상함)가 있으면 stderr에 보고하고 상태 1로 종료됩니다. 그렇지 않으면 stdout에 보고하고 0으로 종료됩니다.
밀리초는반올림됨마이크로초부터.
답변3
실제로 ! 라는 패키지도 있습니다 coreutils-date
. 그것에 대해 몰랐어요! 모든 표준 기능이 포함되어 있습니다!
답변4
#include <stdio.h>
#include <time.h>
void main (void){
long ms;
time_t s;
struct timespec spec;
clock_gettime(CLOCK_REALTIME, &spec);
s = spec.tv_sec;
ms = (spec.tv_nsec / 1.0e6);
printf("%d%03d\n", s, ms);
return 0;
}
이는 C 언어로 되어 있으며 coreutils-date 처럼 작동합니다 date +%s%3N
. OpenWrt-SDK를 사용하여 OpenWrt 라우터로 컴파일됩니다.