Unix 시대 이후의 밀리초 수를 얻는 방법은 무엇입니까?

Unix 시대 이후의 밀리초 수를 얻는 방법은 무엇입니까?

저는 html을 사용하고 있고 JavaScript를 사용하여 로딩 타임스탬프를 밀리초 단위로 가져오기 때문에 브라우저 시작 시간을 측정하는 bash 스크립트를 만들고 싶습니다.

브라우저를 호출하기 전의 쉘 스크립트에서 타임스탬프를 얻습니다.

date +%s

문제는 타임스탬프를 초 단위로 가져오고 밀리초 단위로 필요하다는 것입니다. 왜냐하면 때때로 브라우저의 두 번째 실행이 1초 이내에 시작되고 초 대신 밀리초를 사용하여 해당 시간을 정확하게 측정할 수 있어야 하기 때문입니다.

Bash 스크립트에서 밀리초 단위의 타임스탬프를 얻는 방법은 무엇입니까?

답변1

GNU 또는 ast-open 구현 date(또는 해당 옵션이 활성화된 경우 busybox' FEATURE_DATE_NANO)을 사용하여 다음을 사용합니다.

$ date +%s%3N

Unix epoch 이후의 밀리초 수를 반환합니다.

답변2

date +%s.%N예를 들어, 을 제공합니다 1364391019.877418748. %N은 현재 초에 경과된 나노초 수입니다. 이는 9자리이며 날짜가 100000000보다 작은 경우 기본적으로 0으로 채워집니다. 숫자에 대해 수학적 연산을 수행하려는 경우 이는 실제로 문제가 됩니다.bash는 앞에 0이 있는 숫자를 8진수로 처리합니다.. 필드 사양에 하이픈을 사용하여 이 패딩을 비활성화할 수 있습니다.

echo $((`date +%s`*1000+`date +%-N`/1000000))

에포크 이후의 밀리초 수를 순진하게 알려줄 것입니다.

하지만아래 설명에서 Stephane Chazelas가 지적했듯이 이는 date약간 다른 두 가지 시간을 생성하는 두 가지 다른 호출입니다. 두 번째 초가 그 사이에 있으면 계산이 1초만큼 지연됩니다. 그래서:

echo $(($(date +'%s * 1000 + %-N / 1000000')))

또는 최적화(분명해야 하지만 아래 설명 덕분에):

echo $(( $(date '+%s%N') / 1000000));

답변3

bash누구든지 가 아닌 쉘을 사용 ksh93하고 zsh부동 소수점 변수가 있는 경우 $SECONDS다음을 수행하면 typeset -F SECONDS시간을 정확하게 측정하는 것이 편리합니다 .

$ typeset -F SECONDS=0
$ do-something
something done
$ echo "$SECONDS seconds have elapsed"
18.3994340000 seconds have elapsed

버전 4.3.13(2011)부터 모듈에 특수 부동 소수점 변수가 zsh있습니다 .$EPOCHREALTIMEzsh/datetime

$ zmodload zsh/datetime
$ echo $EPOCHREALTIME
1364401642.2725396156
$ printf '%d\n' $((EPOCHREALTIME*1000))
1364401755993

이는 에서 반환된 두 정수(초 및 나노초)에서 파생됩니다 clock_gettime(). 대부분의 시스템에서 이는 double단일 C 부동 소수점 숫자가 수용할 수 있는 것보다 정밀도가 높으므로 산술 표현식에 사용할 때 정밀도가 떨어집니다(1970년 처음 몇 달의 날짜 제외).

$ t=$EPOCHREALTIME
$ echo $t $((t))
1568473231.6078064442 1568473231.6078064

고정밀 시간 차이를 계산하려면(밀리초 이상의 정밀도가 필요할 것으로 예상되지만) $epochtime특수 배열(초와 나노초를 두 개의 개별 요소로 포함)을 사용할 수 있습니다.

버전 5.7(2018)부터 strftime셸 내장은 %NGNU의 나노초 형식 date%.지정된 정밀도도 지원하므로 다음을 통해 에포크 이후의 밀리초 수를 검색할 수도 있습니다.

zmodload zsh/datetime
strftime %s%3. $epochtime

(또는 변수에 저장 -s var)

답변4

Bash 5+에는 마이크로초 단위의 변수가 있습니다: $EPOCHREALTIME.

그래서:

$ echo "$(( ${EPOCHREALTIME//.} / 1000 ))"
1568385422635

에포크(1/1/70) 이후의 시간을 밀리초 단위로 인쇄합니다.

그렇지 않으면 날짜를 사용해야 합니다. GNU 날짜:

echo "$(date +'%s%3N')"

에 나열된 대안 중 하나https://serverfault.com/a/423642/465827

또는 brew install coreutilsOS X의 경우

또는 다른 모든 방법이 실패하면 이 c 프로그램을 컴파일(gcc epochInμsec.c)합니다(필요에 따라 조정).

#include <stdio.h>
#include <sys/time.h>
int main(void)
{
  struct timeval time_now;
    gettimeofday(&time_now,NULL);
    printf ("%ld secs, %ld usecs\n",time_now.tv_sec,time_now.tv_usec);

    return 0;
}

외부 프로그램을 호출하면 디스크에서 읽고 로드하고, 시작하고, 실행하고, 결과적으로 출력을 인쇄하는 데 시간이 걸립니다. 이 작업은 몇 밀리초 정도 걸립니다. 이는 날짜를 포함한 외부 도구를 사용하여 달성할 수 있는 가장 낮은 정확도입니다.

관련 정보