밀리 초 단위로 시간을 가져 오는 명령


286

Linux에서 밀리 초 단위로 시간을 얻는 쉘 명령이 있습니까?


12
date +%s.%N나노초를 줄 수 있습니까?
Wrikken

1
@Wrikken 이것은 이식성이 떨어집니다.
Camilo Martin

16
date + "% Y % m % d. % H % M % S % 3N"-일반적으로이 명령을 사용하여 밀리 초까지 전체 날짜와 고유 시간을 가져 와서 유닉스 bash 스크립트에서 임시 파일 이름을 만듭니다. 시스템이 밀리 초를 처리 할 수없는 경우 각각 3-6 및 9를 사용하여 마이크로 또는 나노초로 이동할 수 있습니다.
Nitin Mahesh

체험date -Ins
박사 Person Person II

답변:


344

date +%s%N 초 수 + 현재 나노초를 반환합니다.

따라서 echo $(($(date +%s%N)/1000000))필요한 것입니다.

예:

$ echo $(($(date +%s%N)/1000000))
1535546718115

date +%s 유용한 경우 에포크 이후 초 수를 반환합니다.


69
이후, 맥 OS에서 작동하지 않습니다 %N지원하지 않습니다date
yegor256

33
Linux 명령을 묻는 질문입니다. @alper의 답변은 GNU coreutils의 날짜 명령에 적합합니다 . OSX GNUtize : Mac OS X에서 GNU 명령 줄 도구 설치 및 사용
caligari

77
date +%s%3N빠른 (기반의 @ 마이클-defort의 대답)
칼리 가리

10
OSX에서는 coreutilsMacPorts 또는 Homebrew 사용의 일부로 GNU 버전의 날짜를 설치 한 다음 gdate명령 을 사용해야합니다 . 이 질문보기 : stackoverflow.com/questions/9804966/…
Pierz

1
날짜 + % s % 3N이 더 쉬워 보이지만 다른 오프셋 계산에 사용하면 타임 스탬프가 1 밀리 초 줄어 듭니다! 그러나이 솔루션은 오프셋 계산으로 완벽하게 작동했습니다
Arsinux

341
  • date +"%T.%N" 현재 시간을 나노초로 반환합니다.

    06:46:41.431857000
  • date +"%T.%6N" 처음 6 자리로 반올림 된 나노초 (마이크로 초)로 현재 시간을 반환합니다.

    06:47:07.183172
  • date +"%T.%3N" 처음 3 자리 (밀리 초)로 반올림 된 현재 시간을 나노초로 반환합니다.

    06:47:42.773

일반적으로 date명령 형식의 모든 필드 에는 선택적 필드 너비가 제공 될 수 있습니다.


32
%xN: 필드 너비에 좋은 것!
fduff

1
날짜 + "% Y % m % d. % H % M % S % 3N"(밀리 초).
Nitin Mahesh

4
나는 이것이 올바른 것으로 표시된 것이 더 나은 대답이라고 생각합니다.
kcondezo

74

나노는 10-9 이고 밀리 10-3 이다. 따라서 우리는 세 번째 첫 문자 인 나노초를 사용하여 밀리 초를 얻을 수 있습니다.

date +%s%3N

보낸 사람 man date:

% N 나노초 (000000000..999999999)

1970-01-01 00:00:00 UTC 이후 % s

출처 : 서버 결함 Bash에서 현재 Unix 시간을 밀리 초 단위로 얻으려면 어떻게해야합니까? .


@Peter Mortensen이 내 게시물 중 하나에서 훌륭한 활동 중 하나를 수행 한 것에 대해 너무 자랑스럽게 생각합니다. :) 감사합니다 !!
fedorqui 'SO 중지 피해'11

46

플래그를 date지원하지 않는 OS X에서는 Homebrew%Ncoreutils사용하여 설치 하는 것이 좋습니다 . 이를 통해 Linux 시스템에서 와 같이 동작 하는 명령에 액세스 할 수 있습니다.gdatedate

brew install coreutils

보다 "네이티브"경험을 위해 언제든지 다음에 추가 할 수 있습니다 .bash_aliases.

alias date='gdate'

그런 다음 실행

$ date +%s%N

10

다음은 밀리 초 단위의 시간을 확보하기위한 Linux 용 휴대용 해킹입니다.

#!/bin/sh
read up rest </proc/uptime; t1="${up%.*}${up#*.}"
sleep 3    # your command
read up rest </proc/uptime; t2="${up%.*}${up#*.}"

millisec=$(( 10*(t2-t1) ))
echo $millisec

출력은 다음과 같습니다.

3010

이것은 쉘 내부 및 procfs와 함께 작동하는 매우 저렴한 작업입니다.


1
지금까지 Xeon Phi BusyBox v1.27.0 (2017-09-27 13:20:28 EDT) MicroOS에서 작동 한 유일한 사람은 기꺼이 세 번 투표했습니다!
Cadoiz

8

date 명령은 OS X에서 밀리 초를 제공하지 않았으므로 파이썬의 별칭을 사용했습니다.

millis(){  python -c "import time; print(int(time.time()*1000))"; }

또는

alias millis='python -c "import time; print(int(time.time()*1000))"'

2
그러나 일단 fork()별도의 프로세스를 종료하면 execPython 인터프리터가 라이브러리를로드 / 초기화하고 결과를 작성하고 종료하면 결과가 더 이상 정확하지 않습니다.
Charles Duffy

4

다른 답변은 대부분의 경우 충분하지만 BusyBox 에서 문제가 발생했을 때 2 센트를 추가 할 것이라고 생각했습니다. 시스템 .

문제의 시스템은 %N 형식 옵션을 하지 않았으며 Python 또는 Perl 인터프리터가 없습니다.

많은 머리를 긁은 후에 우리는 (Dave에게 감사드립니다!)

adjtimex | awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }'

출력에서 초와 마이크로 초를 추출합니다. adjtimex (일반적으로 시스템 시계의 옵션을 설정하는 데 사용) 줄 바꾸기없이 인쇄하므로 서로 붙습니다. 마이크로 초 필드는 0으로 미리 채워 져야하지만 6 자리보다 긴 초 필드에는 영향을 미치지 않습니다. 이로부터 마이크로 초를 밀리 초로 변환하는 것은 쉽지 않습니다.

후행 줄 바꿈이 필요한 경우 (아마도 더 좋기 때문에) 시도하십시오.

adjtimex | awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }' && printf "\n"

또한이 기능이 필요 adjtimex하고 awk사용 가능해야합니다. 그렇지 않은 경우 BusyBox를 사용하면 다음을 사용하여 로컬로 가리킬 수 있습니다.

ln -s /bin/busybox ./adjtimex
ln -s /bin/busybox ./awk

그런 다음 위와 같이

./adjtimex | ./awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }'

또는 물론 PATH

편집하다:

위는 내 BusyBox 장치에서 작동했습니다. 우분투에서 나는 같은 것을 시도하고 adjtimex다른 버전 을 가지고 있음을 깨달았습니다 . 우분투에서 이것은 소수점 이하 자릿수를 마이크로 초 (초행 줄 바꿈 포함)로 초 단위로 시간을 출력했습니다.

sudo apt-get install adjtimex
adjtimex -p | awk '/raw time:/ { print $6 }'

나는 우분투에서 이것을하지 않을 것입니다. 나는 사용할 것이다date +%s%N


와우, 훌륭한 대안! 실제로 당신의 명령은 효과가 있지만, 나는 그 이유를 전혀 모른다. awk 명령에 대한 설명서는 어디서 찾을 수 있습니까?! adjtimex 출력에서 ​​원하는 정보를 추출하기 위해 문자열을 작성하는 방법을 어떻게 알았습니까?
Satria

멋진 busybox 솔루션
Codebling

1

Perl은 AIX와 같은 이국적인 플랫폼에서도 사용할 수 있습니다. 예:

#!/usr/bin/perl -w

use strict;
use Time::HiRes qw(gettimeofday);

my ($t_sec, $usec) = gettimeofday ();
my $msec= int ($usec/1000);

my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
    localtime ($t_sec);

printf "%04d-%02d-%02d %02d:%02d:%02d %03d\n",
    1900+$year, 1+$mon, $mday, $hour, $min, $sec, $msec;

1

다음과 같은 파이썬 스크립트 :

import time
cur_time = int(time.time()*1000)

3
밀리 초 수를 반환하지 않으며 밀리 초로 표시되는 초 수를 반환합니다. 모든 것이 $ SECONDS000
kilianc

1
@ kilianc maoyang의 Python 코드는 밀리 초를 제공합니다.
jlliagre

@ jlliagre : 그러나 실제 시간 해상도는 16-17 ms (1/60 초)보다 낫습니까?
피터 모텐슨

예, 파이썬 time.time()은 적어도 macOS에서 소수점 이하 6 자리까지 부동 소수점을 반환합니다.
porglezomp

1

방금 Alper의 답변 에이 물건을 작동시키기 위해해야 ​​할 일 을 추가하고 싶었습니다 .

Mac에서는을 brew install coreutils사용해야하므로 사용할 수 있습니다 gdate. 그렇지 않으면 Linux에서는 그냥 date입니다. 그리고이 기능은 임시 파일이나 다른 것을 만들지 않고도 시간 명령에 도움이됩니다.

function timeit() {
    start=`gdate +%s%N`
    bash -c $1
    end=`gdate +%s%N`
    runtime=$(((end-start)/1000000000.0))
    echo " seconds"
}

그리고 문자열과 함께 사용할 수 있습니다.

timeit 'tsc --noEmit'

나는이 솔루션을 좋아하지만 millis에 더 관심이 있습니다. 이 기능을 우분투의 .bashrc에 포팅했습니다.function timeit () { start=$(date +%s%N); $*; end=$(date +%s%N); runtime=$(((end-start)/1000000)); echo "$runtime ms" }
Uluaiv

1

버전 4.1 이후 GNU AWK를 사용하면 시간 라이브러리를로드하고 다음을 수행 할 수 있습니다.

$ awk '@load "time"; BEGIN{printf "%.6f", gettimeofday()}'

1970-01-01T00 : 00 : 00 이후 현재 시간을 초 단위로 정확하게 인쇄합니다.

the_time = gettimeofday() 1970-01-01 UTC 이후에 경과 된 시간을 초 단위로 부동 소수점 값으로 반환합니다. 이 플랫폼에서 시간을 사용할 수 없으면를 반환 -1하고 설정하십시오 ERRNO. 반환되는 시간은 1 초 미만의 정밀도를 가져야 하지만 실제 정밀도는 플랫폼에 따라 다를 수 있습니다. gettimeofday()이 플랫폼 에서 표준 C 시스템 호출을 사용할 수 있으면 단순히 값을 반환합니다. 그렇지 않으면 MS-Windows에서는을 사용하려고 시도합니다 GetSystemTimeAsFileTime().

출처 : GNU awk 매뉴얼

Linux 시스템에서 표준 C 함수 getimeofday()는 시간을 마이크로 초 정확도로 반환합니다.


0

시간 및 시간대와 함께 날짜를 표시하려면

날짜 + "% d- % m- % Y % T. % N % Z"

출력 : 22-04-2020 18 : 01 : 35.970289239 IST

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.