Linux, Bash의 Epoch 이후 현재 시간 (초)을 가져옵니다.


633

간단한 date날짜 가 필요 하지만 1970 년 이후 현재 날짜, 시간, 분 및 초 대신 초 단위로 표시됩니다.

date그 옵션을 제공하지 않는 것 같습니다. 쉬운 방법이 있습니까?


22
죄송합니다, 나는 이것을 말해야합니다 ....``날짜는 그 옵션을 제공하지 않는 것 같습니다. 쉬운 방법이 있습니까? ''-매뉴얼을 다시 읽으십시오 ;-)
TheBonsai

7
날짜의 일부 버전에는 있지만 일부는 없습니다. 항상 존재하는 것은 아닙니다. 나는 'type -a date'을 실행하고 다른 버전을 사용했으며 효과가있었습니다.
Scott Rowley

1
FWIW, Ubuntu에는 / bin / date 만 있으며 @Steef의 답변이 작동합니다.
Jonathan Hartley

1
@TheBonsai는 '날짜'도구의 POSIX 표준 버전에 속하지 않습니다. 귀하의 버전에 (아마 GNU) 버전이 있기 때문에 모든 사람의 구현이 있다고 가정해서는 안됩니다.
Wyatt8740 2016 년

답변:


1159

이것은 작동해야합니다 :

date +%s

45
날짜 manpge는 내가 그것을 놓 쳤기 때문에 에서 %s seconds since 1970-01-01 00:00:00 UTC로 변경되어야합니다 %s seconds since the epoch, 1970-01-01 00:00:00 UTC.
devin

3
나를 위해 작동하지 않습니다. 날짜는 % s를 표시하지 않습니다. 아주 오래된 bash 버전 (Solaris의 경우 3.2.51 (1))이 있어야합니까?
livefree75

7
@ livefree75 date는에 포함되어 있지 않으므로 사용중인 bash버전은 시스템 bash과 함께 제공되는 date구현 과 관련이 없습니다 .
Adrian Frühwirth

11
그리고 소수점 이하 9 자리까지의 분수를 원한다면 다음을 사용하십시오.date +%s.%N
Jonathan Hartley

19
밀리 초 사용date +%s%3N
Juan Campa

133

추가하기 만하면됩니다.

주어진 날짜 (예 : 1973 년 10 월 21 일)에 대한 에포크 (1970 년 1 월 1 일) 이후의 초를 가져옵니다.

date -d "Oct 21 1973" +%s


초를 다시 날짜로 변환

date --date @120024000


이 명령 date은 매우 다양합니다. 날짜로 할 수있는 또 다른 멋진 일 (뻔뻔스럽게에서에서 복사 date --help). 다음 주 금요일 오전 9시 (미국 서해안)에 현지 시간 표시

date --date='TZ="America/Los_Angeles" 09:00 next Fri'

더 나은 방법은 매뉴얼 페이지 http://man7.org/linux/man-pages/man1/date.1.html 을 읽는 데 시간이 좀 걸립니다


이것은 OP의 질문이 아니지만 내 답변이므로 +1입니다.
AnthonyD973

어쩌면 (macOS Catalina)를 date사용하고 있기 때문일 수도 zsh있지만 이것이 효과가 없습니다. $ date -d "Oct 21 1973" +%s출력을 실행usage: date [-jnRu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ... [-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format]
Joshua Pinter

43

지금까지 모든 답변은 외부 프로그램을 사용합니다 date.

Bash 4.2부터는 인수와 함께 사용될 때 ( 포맷에 대한 정보를 위해)에 의해 처리되는 형식으로 현재 날짜를 출력 printf하는 새로운 수정자가 있습니다.%(dateformat)T-1dateformatstrftime(3)man 3 strftime

따라서 순수한 Bash 솔루션의 경우 :

printf '%(%s)T\n' -1

또는 결과를 변수에 저장 해야하는 경우 var:

printf -v var '%(%s)T' -1

외부 프로그램이나 서브 쉘이 없습니다!

Bash 4.3부터는 -1다음을 지정하지 않아도됩니다 .

printf -v var '%(%s)T'

(그러나 -1그럼에도 불구하고 항상 논쟁을 제기하는 것이 현명 할 수 있습니다 ).

당신이 사용하는 경우 -2대신 인수로 -1, 배쉬 쉘 대신 현재 날짜의 시작된 시간을 사용합니다. 경과 시간을 계산하는 데 사용할 수 있습니다

$ printf -v beg '%(%s)T\n' -2
$ printf -v now '%(%s)T\n' -1
$ echo beg=$beg now=$now elapsed=$((now-beg))
beg=1583949610 now=1583953032 elapsed=3422

9
-2더 오래 실행되는 작업 (백업을 제어하는 ​​스크립트를 생각)이있는 경우 에 사용하고 싶고 "지금 $$에 완료된 경우 $ 백업이 시작되었습니다"라는 메일을 보내십시오 -2. 처음에 전용 변수.
Sebastian J.

23

대부분의 Awk 구현에서 :

awk 'BEGIN {srand(); print srand()}'

21
와우 그것은 모호하다
ericslaw

8
와우, 이걸 찾아봐야 했어요. 이것은 실용적인 솔루션이지만 반드시 좋은 것은 아닙니다. awk의 구현srand() 은 일반적으로 현재 날짜 / 시간으로 시작됩니다. 두 번째 호출은 srand()이전에 시드로 사용 된 값 을 반환합니다.
Ryan Ransford

23

순수한 배쉬 솔루션

bash5.0 이후 ( 2019 년 1 월 7 일에 릴리스 ) 내장 변수를 사용할 수 있습니다 EPOCHSECONDS.

$ echo $EPOCHSECONDS
1547624774

또한이 EPOCHREALTIME초 분수를 포함한다.

$ echo $EPOCHREALTIME
1547624774.371215

EPOCHREALTIME소수점을 제거하여 마이크로 초 (μs)로 변환 할 수 있습니다. 이것은 정수만 처리 할 수있는 bash내장 연산 (( expression ))을 사용할 때 관심이있을 수 있습니다 .

$ echo ${EPOCHREALTIME/./}
1547624774371215

위의 모든 예에서 인쇄 시간 값은 가독성을 높이기 위해 동일합니다. 실제로 각 명령을 실행하는 데 약간의 시간이 걸리므로 시간 값이 달라집니다.


밀리 초 해상도 (와 같은 형식 date +%s%3N)의 경우 다음을 사용할 수 있습니다.echo $(( ${EPOCHREALTIME/./} / 1000 ))
luckman212

19

이것은 @pellucide가 한 일에 대한 확장이지만 Mac의 경우 :

특정 날짜 (예 : 1973 년 10 월 21 일)에 대한 에포크 (1970 년 1 월 1 일) 이후의 시간 (초)을 결정하려면

$ date -j -f "%b %d %Y %T" "Oct 21 1973 00:00:00" "+%s"
120034800

완성도를 위해 시간 부분을 형식에 추가했습니다. 그 이유는 date당신이 어떤 날짜를 주었 든 현재 시간을 제공된 값에 더할 것이기 때문 입니다. 예를 들어, 오후 4시 19 분에 '00 : 00 : 00 '부분없이 위 명령을 실행하면 시간이 자동으로 추가됩니다. "1973 년 10 월 21 일"은 "1973 년 10 월 21 일 16:19:00"로 구문 분석됩니다. 그것은 당신이 원하는 것이 아닐 수도 있습니다.

타임 스탬프를 다시 날짜로 변환하려면

$ date -j -r 120034800
Sun Oct 21 00:00:00 PDT 1973

날짜 구현에 대한 Apple의 설명서 페이지 : https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/date.1.html


1
분명히 이것은 BSD의 date명령에 대한 것이며, 제안하는 모든 솔루션 date -d은 GNU에 대한 것 date입니다. macOS의 BSD 날짜는 FreeBSD 에서 왔으며 NetBSD 및 OpenBSD와 많은 옵션을 공유합니다. 그리고 이것은 배쉬 와 완전히 별개 입니다.
ghoti

그만큼 %NGNU 날짜에 분수 초 동안 언급 한 옵션은 맥 OS 날짜에서 누락되었습니다. 10.14에서는 매뉴얼 페이지에 형식이 없습니다. 그들은에있어 strftime(3)당신이 엑스 코드가 설치되어 있지 않으며, 당신이 할 경우에도 사람의 명령으로 표시되지 않을 경우가 없습니다 매뉴얼 페이지.
Dan Pritts

1

이 bash 스크립트 (my ~/bin/epoch)를 사용하십시오.

#!/bin/bash

# get seconds since epoch
test "x$1" == x && date +%s && exit 0

# or convert epoch seconds to date format (see "man date" for options)
EPOCH="$1"
shift
date -d @"$EPOCH" "$@"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.