터미널에서 에포크 이후 시간 (밀리 초)


40

OSX 터미널에서 획기적인 시간 (밀리 초)을 어떻게 알 수 있습니까?

리눅스 / 우분투는 date +%s.%N다음 과 같습니다 :

Linux $ date +%s.%N
1403377762.035521859

OSX 터미널에서 작동하지 않는 항목 :

OSX $ date +%s.%N
1403377800.N

답변:


47

dateOS X 의 프로그램은 GNU의 coreutils date프로그램 과 다릅니다 . coreutils (gnu-date 포함)를 설치하면 date밀리 초를 지원 하는 버전이 제공 됩니다.

원시 OS X 사용자에게는 소스에서 설치하는 것이 번거로울 수 있으므로 Homebrew 를 사용하는 것이 좋습니다 .

Homebrew를 사용하여 이러한 도구를 설치하려면 터미널에서이 oneliner를 실행하십시오.

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

이제 Homebrew가 설치되었습니다 (설치 후 설치 프로그램의 제안을 따르는 것이 좋습니다). 이제 우리는를 사용하여 coreutils를 설치할 것 brew입니다.

brew install coreutils

설치에서 알 수 있듯이 모든 명령은 접두사 'g'(예 : gdate, gcat, gln 등)로 설치되었습니다. 이 명령을 일반 이름과 함께 사용해야하는 경우 "gnubin"디렉토리를 PATH ( ~/.bash_profile)에 다음과 같이 추가 할 수 있습니다 .

PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"

당신은 지금 실행할 수 있습니다

gdate +%s.%N

에포크 이후 시간을 밀리 초 단위로 출력합니다.


3
좋은. 나는 경로를 추가 할 필요조차 없었 gdate습니다 /usr/local/bin/gdate.
Adam Matan

그것이 당신이 기대하는 것입니다. 모든 바이너리는 g 접두사로 설치됩니다. 경로에서 나는 동일한 gnu-coreutils에 g 접두사가 없습니다. 따라서 PATH = "/ usr / local / opt / coreutils / libexec / gnubin : $ PATH"와 같은 경로에 추가하면 원본이 바뀝니다. 그래서 OS X datedategdate 대신 GNU 가되었습니다
CousinCocaine

잘 작동했습니다.
CousinCocaine 2016 년

3
기술적 +%s.%N으로이 형식은 초를 밀리 초가 아닌 나노초 단위로 줄입니다. brew를 사용하여 install을 설치 한 후 gdate맨 페이지에서 밀리 초를 사용할 수 있는지 확인했습니다. 그렇지 않습니다. 또한 정밀도를 %N지정할 수 있다고 말하지는 않았지만 어쨌든 시도했습니다. 나는 초를 밀리 초 정밀도 (예 : 소수점 이하 세 자리)로 낮추는 명령이 gdate +%s.%3N입니다.
LS

9

OS X에서는 OS X date +%sdate출력 에서 이보다 더 높은 정밀도를 지원하지 않고 내부 표현에서 지원되지 않는 초과 정밀도는 마이너스 무한대로 잘립니다.

밀리 초 출력을 원할 경우 다음 명령을 사용할 수 있지만 위에서 언급 한 이유로 인해 정밀도를 추가하는 대신 0을 추가하여 출력을 수정하면됩니다. 다음은 필요한 정밀도를 지원하는 시스템에서 올바른 밀리 초를 출력합니다.

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

위 명령의 소스 : Unix.SE – Unix epoch 이후 밀리 초를 얻는 방법

OS X에서 올바른 수의 0을 추가하는 명령을 원한다면 다음을 사용할 수 있습니다.

date +%s000

OS X은을 지원 %-N하지 않으므로 아무 것도하지 않습니다 (쉘 변수 $N가 설정 되면 문제가 발생할 수 있습니다 ). 사용하십시오 date +%s000(또는 date +%s.000소수점을 원할 경우).
Gordon Davisson 2016 년

@Gordon 네, 이것을 언급했지만 OP가 정밀성을 갖춘 시스템에서 성공적으로 작동하는 휴대용 솔루션을 찾고 있다면 위의 명령이 작동합니다. 물론 단순히 출력에 0을 추가 할 수 있지만 추가 정밀도를 지원할 수있는 다른 시스템에 복사하는 것은 이상적이지 않습니다.
grg

아, 알겠습니다 그러나 OS X의 date명령은 %-Nas를 통과 N하기 때문에 계산을 방해 할 수 있습니다. 설정 N=7000000000000000000을 시도한 다음 명령을 시도하십시오 ... 실제로는 그렇지 않지만 환경에 의존하지 않는 것으로 안전합니다.
Gordon Davisson 2016 년

@Gordon 실제로 변수를 설정하면 변수가 깨질 수 있습니다. 명령이 실행되기 직전에 특정 변수를 재설정 할 수 있다고 가정하지만, 그런 경우와 같이 변수를 재설정하는 것은 어쨌든 명령을 실행하기 전에 모든 훌륭한 스크립트가해야 할 일입니다. 물론 이것은 모두 OP가 스크립트를 원한다는 가정을 기반으로합니다. 문자 그대로 0을 추가하도록 편집 된 답변입니다.
grg

2
OP는 "에포크 이후 시간 (밀리 초)"을 요청했는데 이는 문자열에 0을 추가하는 방법에 대한 답변입니다. 동일하지 않습니다. 게시물에 설명되어 있지만 질문에 대한 답변은 아닙니다.
CousinCocaine 2016 년

6

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

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

#!/bin/bash

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

또는 python스크립트를 직접 작성하십시오 .

#!/usr/bin/python

from time import time
print int(round(time() * 1000)) 

4

펄은 어디에나있다.

$ perl -MTime::HiRes=time -e 'printf "%.9f\n", time'
1557390839.244920969
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.