programing

시간(밀리초)을 가져오는 명령

mailnote 2023. 5. 11. 21:42
반응형

시간(밀리초)을 가져오는 명령

리눅스에 시간을 밀리초 단위로 구하는 셸 명령이 있습니까?

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

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

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

    06:47:42.773
    

일으로분, 모든야의의 date명령의 형식에는 선택적인 필드 너비를 지정할 수 있습니다.

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

그므로러,echo $(($(date +%s%N)/1000000))당신에게 필요한 것입니다.

예:

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

date +%s에포크 이후의 시간(초)을 반환합니다(도움이 될 경우).

나노는−9 10이고 밀리는−3 10입니다.따라서 나노초의 세 개의 첫 문자를 사용하여 밀리초를 얻을 수 있습니다.

date +%s%3N

man date:

%N나노초(000000000..999999999)

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

출처: Server Fault의 현재 Unix 시간(밀리초)을 Bash로 가져오려면 어떻게 해야 합니까?

에서 여기서 OS X 서, 위date에서는 를하지않다습을 하십시오.%N 그래권, 합니다장를을 합니다.coreutils홈브루를 사용합니다.이렇게 하면 다음 명령에 액세스할 수 있습니다.gdate처럼 행동할 것입니다.date는 Linux 시스템에서 수행됩니다.

brew install coreutils

보다 "원본적인" 경험을 위해, 당신은 언제든지 이것을 당신의 웹사이트에 추가할 수 있습니다..bash_aliases:

alias date='gdate'

그러면 실행

$ date +%s%N

다음은 밀리초 단위로 시간을 얻을 수 있는 리눅스용 휴대용 해킹입니다.

#!/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에서 작동하는 매우 저렴한 작업입니다.

순수 배쉬 용액

때부터bash5.0 (2019년 1월 7일 출시) 기본 제공 변수를 사용할 수 있습니다.EPOCHREALTIME 정밀도(μs 이하를 에포크 를 포함합니다.echo $EPOCHREALTIME와 같은 것을 인쇄합니다.1547624774.371210)를 .마지막 세 곳은 밀리초 단위로 표시됩니다.

둘 중 하나 사용

(( t = ${EPOCHREALTIME/./} / 1000 ))

또는 그와 비슷한 것.

t=${EPOCHREALTIME/./}  # remove the dot (s → µs)
t=${t%???}             # remove the last three digits (µs → ms)

쪽이든t비슷한 것이 될 것입니다.1547624774371.

대부분의 경우 다른 답변으로 충분할 수 있지만, BusyBox 시스템에서 문제가 발생했기 때문에 2센트를 추가해야겠다고 생각했습니다.

을 하지 않았습니다.%Nformat 옵션이며 Python 또는 Perl 인터프리터가 없습니다.

우리는 머리를 긁적이며 다음과 같이 생각해 냈습니다.

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 장치에서 작동했습니다.해 보았는데 Ubuntu에서 Ubuntu를 했습니다.adjtimex버전이 다릅니다.Ubuntu에서 이 작업은 소수점에서 마이크로초(후행 새 줄 포함)까지의 시간(초)을 출력하는 데 사용되었습니다.

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

Ubuntu에서는 이렇게 하지 않을 것입니다.나는 사용할 것입니다.date +%s%N

date하지 않았기 을 사용했습니다.

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

OR

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

편집: @CharlesDuffy의 코멘트를 따릅니다.자식 프로세스를 포크하는 데는 시간이 더 걸립니다.

$ time date +%s%N
1597103627N
date +%s%N  0.00s user 0.00s system 63% cpu 0.006 total

Python은 여전히 VM 시작 시간을 개선하고 있으며 컴파일된 코드(예:date).

에서는 약 - , 가, 약의즉 30ms - 60ms (다, 6ms니 5x-10x)가되었습니다.date)

$ time python -c "import time; print(int(time.time()*1000))"
1597103899460
python -c "import time; print(int(time.time()*1000))"  0.03s user 0.01s system 83% cpu 0.053 total

나는 생각했습니다.awk 다가니습보다 가볍습니다.python,그렇게awk ~ ~ ) 에서 사용됩니다. 6ms ~ 12ms 범 (표시: 1x ~ 2x):

$ time awk '@load "time"; BEGIN{print int(1000 * gettimeofday())}'
1597103729525
awk '@load "time"; BEGIN{print int(1000 * gettimeofday())}'  0.00s user 0.00s system 74% cpu 0.010 total

날짜와 시간대를 표시하는 방법

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

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

저는 앨퍼의 대답에 이 일을 성공시키기 위해 제가 해야 할 일을 덧붙이고 싶었습니다.

Mac에서는 다음과 같은 기능이 있습니다.brew install coreutils그래서 우리는 사용할 수 있습니다.gdate그렇지 않으면 리눅스에서는 그냥date또한 이 기능을 사용하면 임시 파일이나 다른 파일을 만들지 않고도 명령 시간을 지정할 수 있습니다.

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

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

timeit 'tsc --noEmit'

버전 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초 미만의 정밀도를 가져야 하지만, 실제 정밀도는 플랫폼에 따라 다를 수 있습니다.표준 C일 경우gettimeofday()시스템 호출은 이 플랫폼에서 사용할 수 있으며, 그러면 단순히 값을 반환합니다.에는 MS-Windows의 그렇지를 하려고 합니다.GetSystemTimeAsFileTime().

출처: GNU awk 매뉴얼

시스템의 C 리눅스는 C입니다.getimeofday()마이크로초 정확도로 시간을 반환합니다.

bash에서 값을 생성하고 Java 코드에서 해당 값을 사용하여 다시 날짜(java.util)로 변환하고 싶습니다.

다음 명령은 bash 파일에 값을 생성하는 데 사용됩니다.

date +%s000

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;

다음과 같은 Python 스크립트:

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

10진수 초를 인쇄하는 방법

start=$(($(date +%s%N)/1000000)) \
    && sleep 2 \
    && end=$(($(date +%s%N)/1000000)) \
    && runtime=$((end - start))

divisor=1000 \
    && foo=$(printf "%s.%s" $(( runtime / divisor )) $(( runtime % divisor ))) \
    && printf "runtime %s\n" $foo # in bash integer cannot cast to float

출력:runtime 2.3

언급URL : https://stackoverflow.com/questions/16548528/command-to-get-time-in-milliseconds

반응형