bash에서 현재 유닉스 시간을 밀리 초 단위로 얻는 방법은 무엇입니까?


232

현재 유닉스 시간을 밀리 초 단위로 얻는 방법 (예 : 1970 년 1 월 1 일 유닉스 시대 이후의 밀리 초 수)?

답변:


264

이:

date +%s 

에포크 이후 수를 반환합니다 .

이:

date +%s%N

초와 현재 나노초를 반환합니다.

그래서:

date +%s%N | cut -b1-13

에포크 이후 현재 시간 (밀리 초)에 왼쪽 세 나노초를 더한 밀리 초를 표시합니다.


과에서 MikeyB - echo $(($(date +%s%N)/1000000))(1000 분할 만 마이크로에 제공)


39
컷이 얼마나 많은 ms를 추가하는지 궁금합니다 :-)
Kyle Brandt

13
또는 추가 프로세스의 값 비싼 오버 헤드를 피하기 위해 쉘에서 모든 작업을 수행하려는 경우 (실제로 % + s + N의 자릿수가 변경 될 때 문제가 발생하지 않습니다.)echo $(($(date +%s%N)/1000))
MikeyB

5
그것은 문제의 원칙입니다 ... 마법의 숫자를 피하고 실제로 의미하는 것을 코딩하십시오 .
MikeyB

25
나는 남자가 Linux가 아닌 Unix를 요구했으며 현재의 최고 답변 (날짜 + % s % N)이 내 AIX 시스템에서 작동하지 않는다는 점에 주목할 가치가 있다고 생각합니다.
Pete

12
@Pete +1 OS X와 ​​동일하며 FreeBSD
ocodo

99

%3N나노초를 가장 중요한 3 자리 숫자 (밀리 초)로 자르기 위해 간단히 사용할 수 있습니다 .

$ date +%s%3N
1397392146866

이것은 예를 들어 내 kubuntu 12.04에서 작동합니다.

그러나 %N대상 시스템에 따라 구현되지 않을 수 있습니다. 예를 들어 임베디드 시스템 (빌드 루트 rootfs, 비 HF arm 크로스 툴체인을 사용하여 컴파일)에서 테스트 한 결과는 %N다음과 같습니다.

$ date +%s%3N
1397392146%3N

(또한 내 (뿌리가 아닌) 안드로이드 태블릿에는 없습니다 %N).


1
@ warren : 당신이를 편집하고을 변경 한 1397392146%3N것을 1397392146%N보았지만 결과는 1397392146%3N안드로이드 태블릿의 busybox 콘솔에서 실제로 본 것입니다. 편집 내용을 설명해 주시겠습니까?
Joe

역사에서 워렌의 의견은 "3은 단지 당신을 마이크로 초로 데려 가기 때문에 3에서 6으로 변경되었습니다". 그의 편집은 전적으로 의심스러워 보인다. 롤백해야합니다.
bukzor

1
이것은 특별히 GNU coreutils의 기능입니다. 궁극적으로,이 여기 gnulib에서 구현됩니다 github.com/gagern/gnulib/blob/...를 .
telotortium

아마도 거기에 점이 의미가 있습니다. date +%s.%3N인쇄합니다 1510718281.134.
darksky

이것이 정답입니다.
노아 서스 먼

61

date +%N OS X에서는 작동하지 않지만 다음 중 하나를 사용할 수 있습니다

  • 루비: ruby -e 'puts Time.now.to_f'
  • 파이썬 : python -c 'import time; print time.time()'
  • node.js : node -e 'console.log(Date.now())'
  • PHP : php -r 'echo microtime(TRUE);'
  • 엘릭서 : DateTime.utc_now() |> DateTime.to_unix(:millisecond)
  • 인터넷 : wget -qO- http://www.timeapi.org/utc/now?\\s.\\N
  • 또는 가장 가까운 초로 반올림 한 밀리 초 date +%s000

1
완전성을 위해 ...node -e 'console.log(Date.now())'
slf

1
PHP를 사용 :php -r 'echo microtime(TRUE);'
TachyonVortex

8
물론 통역사들이 워밍업 할 때까지 기다려야합니다. – 또한 작동합니다 :wget -qO- http://www.timeapi.org/utc/now?\\s.\\N
Camilo Martin

8
또는 실제로 밀리 초가 필요하지 않고 올바른 형식 인 경우 :date +%s000
Lenar Hoyt


9

그냥 이것을 버리고 있지만, 나눗셈의 올바른 공식은 다음과 같습니다.

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

9

내 솔루션은 최고는 아니지만 나를 위해 일했습니다.

date +%s000

방금 2012-05-05와 같은 날짜를 밀리 초로 변환해야했습니다.


1
놀라운 해킹, lol :)
k06a

7
당신은 내 동료 중 누군가 여야합니다.
Nakilon

7

외부 프로그램을 실행하여 밀리 초 를 얻는 것을 제안하는 사람들에게는 그 속도로 다음을 수행 할 수도 있습니다.

wget -qO- http://www.timeapi.org/utc/now?\\s.\\N

요점 : 여기에서 답을 고르기 전에 모든 프로그램이 1 초 이내에 실행되는 것은 아닙니다. 법안!


시간 동안 로컬 시스템을 요구하지 않습니다. 질문에 암시되어있는 것 같습니다. 또한 네트워크 연결에 의존합니다.
orkoden

2
@orkoden이 질문은 명시 적으로 "1970 년 1 월 1 일 유닉스 시대 이후의 밀리 초 수"를 요구한다. 또한 시간을 얻기 위해 루비 또는 파이썬 (또는 wget) 전체를 발사하지 않아야하는 방법에 대해 더 많이 지적하고 있습니다. 이것은 빠른 채널을 통해 수행되거나 밀리 초는 중요하지 않습니다.
Camilo Martin

2
예, 귀하가 잘못된 솔루션의 결함을 강조하기 위해 더 나쁜 솔루션을 제공하고 있음을 이해했습니다. 몇 가지 해결책을 시도하고 시간을 측정했습니다. lpaste.net/119499 결과는 흥미 롭습니다. 매우 빠른 i7 시스템에서도 date실행하는 데 3ms가 걸립니다.
orkoden

@orkoden 니스 테스트! 어떤 OS? 이것은 프로세스 생성 오버 헤드와 관련이있을 수 있습니다.
Camilo Martin

1
@ Nakilon 그리고 이것이 생산을위한 것과 같은 컬 가능한 편의에 의존해서는 안되는 이유입니다.
Camilo Martin

4

이 솔루션은 macOS에서 작동합니다.

bash 스크립트 사용을 고려하고 파이썬을 사용할 수 있다면 다음 코드를 사용할 수 있습니다.

#!/bin/bash

python -c 'from time import time; print int(round(time() * 1000))'

왜 다운 투표?
Frank Thonig

특별히 정당화되지 않은 것 같습니다. 아래쪽 화살표의 힌트에는 "이 답변은 유용하지 않습니다"라고 표시되어 있지만 IMO가 유용합니다. 어쩌면 그들은 대신 당신이 그것을 파이썬 스크립트로 만들고 싶을 수도 있습니다. 그것은 더 간단하고 bash 명령으로도 잘 작동합니다.
Andrew Schulman

downvotes에 대해 너무 걱정하지 마십시오 (내 것이 아니 었습니다) ... 특히 그들이 익명 인 경우 (누구든지 잘못된 것으로 보이는 것을 배울 수 없습니다.)? 그냥 당신이 그것을 처리하기 위해 ... 여기 또 다른 +1 간다 ... 무엇을 추측 : 당신은 또한 지금 "투표"할 수 있습니까?
Pierre.Vriens

downvote는 시스템 문제로 인한 것으로 보입니다. 시스템에 의해 다시 제거되었습니다.
Michael Hampton

2

스크립트가 실행 된 시간을 표시하는 방법을 찾고 있다면 다음과 같은 결과가 제공됩니다 (완전히 정확하지는 않음).

스크립트 시작 부분에 다음과 같이 입력하십시오.

basetime=$(date +%s%N)

1361802943996000000과 같은 시작 값을 제공합니다.

스크립트가 끝나면 다음을 사용하십시오.

echo "runtime: $(echo "scale=3;($(date +%s%N) - ${basetime})/(1*10^09)" | bc) seconds"

다음과 같이 표시됩니다

runtime: 12.383 seconds

노트:

원하는 경우 (1 * 10 ^ 09)를 1000000000으로 대체 할 수 있습니다.

"scale=3"bc당신이 원하는 것을 강요하는 다소 드문 설정입니다 . 더 많은 것이 있습니다!

나는 Win7 / MinGW에서만 이것을 테스트했다 ... 나는 적절한 * nix 상자가 없다.


3
아니면 그냥 사용할 수 있습니다time <script>
warren

2

나누기를 수행하지 않고 밀리 초 단위로 시간을 얻는 방법은 다음과 같습니다. 아마도 더 빠를 수도 있습니다 ...

# test=`date +%s%N`
# testnum=${#test}
# echo ${test:0:$testnum-6}
1297327781715

업데이트 : 순수 bash의 다른 대안은 bash 4.2+위와 동일하지만 printf날짜를 얻는 데 사용됩니다. 프로세스가 메인 프로세스에서 분리되지 않기 때문에 확실히 빠릅니다.

printf -v test '%(%s%N)T' -1
testnum=${#test}
echo ${test:0:$testnum-6}

그러나 여기에서 또 다른 캐치는 점이다 strftime구현이 지원해야 %s하고 %N내 테스트 시스템의 경우 어떤 아닙니다. man strftime지원되는 옵션을 참조하십시오 . 참조 man bash표시 printf구. -1-2시간에 대한 특별한 값입니다.


strftime(3)지원하지 않아 나노초를 인쇄 %N할 방법 이없는 것 같습니다 printf. 우분투 14.04를 사용하고 있습니다.
haridsv

@haridsv, 예, glibc에 없습니다. date더 안정적인 옵션처럼 보입니다.
akostadinov

2

우리가 얻을 수있는 가장 정확한 타임 스탬프 (적어도 Mac OS X의 경우)는 다음과 같습니다.

python -c 'import datetime; print datetime.datetime.now().strftime("%s.%f")'

1490665305.021699

그러나 실행하는 데 약 30 밀리 초가 걸린다는 점을 명심해야합니다. 우리는 이것을 2 자리 분수로자를 수 있으며, 처음 에는 시간을 읽는 평균 오버 헤드 를 계산 한 다음 측정에서 제거 할 수 있습니다. 예를 들면 다음과 같습니다.

function getTimestamp {
  echo `python -c 'import datetime; print datetime.datetime.now().strftime("%s.%f")' | cut -b1-13` 
}
function getDiff {
  echo "$2-$1-$MeasuringCost" | bc
}
prev_a=`getTimestamp`
acc=0
ITERATIONS=30
for i in `seq 1 $ITERATIONS`;do 
  #echo -n $i 
  a=`getTimestamp`
  #echo -n "   $a"
  b=`echo "$a-$prev_a" | bc`
  prev_a=$a
  #echo "  diff=$b"
  acc=`echo "$acc+$b" | bc`
done
MeasuringCost=`echo "scale=2; $acc/$ITERATIONS" | bc`
echo "average: $MeasuringCost sec"
t1=`getTimestamp`
sleep 2
t2=`getTimestamp`
echo "measured seconds: `getDiff $t1 $t2`"

echo 명령을 주석 해제하여 작동 방식을보다 잘 볼 수 있습니다.

이 스크립트의 결과는 일반적으로 다음 3 가지 결과 중 하나입니다.

measured seconds: 1.99
measured seconds: 2.00
measured seconds: 2.01

1

날짜와 expr을 사용하면 거기에 갈 수 있습니다.

X=$(expr \`date +%H\` \\* 3600 + \`date +%M\` \\* 60 + \`date +%S\`)
echo $X

원하는대로 할 수 있도록 확장하세요

나는 이것이 획기 이후 밀리 초를주지 않는다는 것을 알고 있지만, 일부 경우에 대한 답변으로 여전히 유용 할 수 있습니다. 모두 밀리 초 숫자가 필요한 경우 실제로 필요한 것에 따라 1000을 곱합니다. : D

가장 간단한 방법은 작은 실행 파일 (C f.ex에서)을 만들어 스크립트에서 사용할 수 있도록하는 것입니다.


date여러 번 실행되는 잠재적 인 문제가 있습니다 . 경우에 따라 명령이 작성 될 때 실행간에 날짜 나 시간이 변경 될 수 있습니다. date한 번 실행 하고 부품을 파싱하고 계산을 수행하는 것이 좋습니다 . 그렇게하는 몇 가지 방법 중 하나는 다음과 같습니다 t=$(date +%H%M%S); (( x = ${t:0:2} * 3600 + ${t:2:2} * 60 + ${t:4:2} )); echo "$x". 이것은 질문에 bash 태그가 붙어 있기 때문에 Bash 구문을 사용합니다 . 당신이 암시하는 것처럼, 당신의 대답 (및 나의 변형)은 지금까지의 시간을 초 단위로 제공합니다.
Dennis Williamson

1

(위에서 반복) date +%NOS X에서는 작동하지 않지만 다음을 사용할 수도 있습니다.

Perl (Time :: Format 모듈 필요) 아마도 사용하기에 가장 좋은 CPAN 모듈은 아니지만 작업을 수행 할 수 있습니다. Time :: Format은 일반적으로 배포판에서 사용할 수 있습니다.

perl -w -e'use Time::Format; printf STDOUT ("%s.%s\n", time, $time{"mmm"})'

OP는 bash를 사용하여 작업을 수행하는 방법을 구체적으로 요청했습니다. 이 bash는 어떻게 다른 것을 시작하는 방법으로 저장됩니까?
MadHatter

OSX의 bash 쉘 스크립트에서 이것을 사용합니다. 따라서 date사용할 수 없으며 필요에 응답하는 bash 전용 명령이 없습니다.
TVNshack

그럴 수 있지. OSX를 왜 귀하의 답변의 일부로date 사용할 수 없는지 분명히 밝히 려면 공감대를 제거하겠습니다.
MadHatter

이것은 위의 몇 가지 답변에 대해 설명했습니다. 제안 된 목록에서 누락 된 명령을 주석으로 추가 할 수 없습니다. 여기에 추가했습니다.
TVNshack

공정하게, 나는 이것이 캐논에 유용한 추가 사항이라는 것을 인정합니다. 나에게서 +1!
MadHatter

1

OSX에있을 때 이전 응답을 모두 합치기

ProductName:    Mac OS X
ProductVersion: 10.11.6
BuildVersion:   15G31+

당신은 좋아할 수 있습니다

microtime() {
    python -c 'import time; print time.time()'
}
compute() {
    local START=$(microtime)
    #$1 is command $2 are args
    local END=$(microtime)
    DIFF=$(echo "$END - $START" | bc)
    echo "$1\t$2\t$DIFF"
}

0

간단한 쉘 경과 계산을 원한다면 위의 대답을 사용하여 쉽고 휴대가 가능합니다.

now() {
    python -c 'import datetime; print datetime.datetime.now().strftime("%s.%f")'
}
seismo:~$ x=`now`
seismo:~$ y=`now`
seismo:~$ echo "$y - $x" | bc
5.212514

0

알파인 리눅스 (많은 docker 이미지) 및 기타 최소 리눅스 환경의 경우 남용 할 수 있습니다 adjtimex.

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

adjtimex커널 시간 변수를 읽고 설정하는 데 사용됩니다. 를 사용 awk하면 마이크로 초를 얻을 head수 있으며 처음 3 자리 만 사용할 수 있습니다.

이 명령이 얼마나 안정적인지 잘 모르겠습니다.

참고 : 이 답변 에서 부끄러운 도난

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