Unix 타임 스탬프를 날짜 문자열로 변환


128

Unix 타임 스탬프를 Unix 명령 줄에서 날짜로 변환하는 한 줄짜리 빠른 방법이 있습니까?

date각 요소 (월, 일, 연도, 시간 등)를 지정하는 것이 다소 어색하다는 점을 제외하고는 작동 할 수 있으며 제대로 작동하도록하는 방법을 알 수 없습니다. 더 쉬운 방법이있는 것 같습니다. 내가 뭔가를 놓치고 있습니까?


답변:


181

GNU를 사용 date하면 다음을 수행 할 수 있습니다.

date -d "@$TIMESTAMP"
# date -d @0
Wed Dec 31 19:00:00 EST 1969

(From : BASH : Unix 타임 스탬프를 날짜로 변환 )

OS X에서는 date -r.

date -r "$TIMESTAMP"

또는 strftime(). 셸에서 직접 사용할 수는 없지만 gawk 를 통해 액세스 할 수 있습니다 . %c지정 로케일에 의존하는 방식으로 타임 스탬프를 표시합니다.

echo "$TIMESTAMP" | gawk '{print strftime("%c", $0)}'
# echo 0 | gawk '{print strftime("%c", $0)}'
Wed 31 Dec 1969 07:00:00 PM EST

3
타임 스탬프에서 밀리 초를 제거해야합니다 (즉, 13 자리가 아닌 10 자리 숫자 임). 그렇지 않으면 잘못된 결과가 표시됩니다 (macOS 날짜의 경우 해당됨).
emerino

밀리 단위의 타임 스탬프가 있다는 것을 알기 전까지는 이것이 작동하지 않는다고 생각했습니다. 마지막 3 자리 숫자를 잘라, 당신은 정확한 시간 얻을
스튜어트

64

date -d @1278999698 +'%Y-%m-%d %H:%M:%S' 뒤에 @있는 숫자는 초 단위의 숫자입니다.


28
OSX 10.8에서는 date -r 1278999698 +'%Y-%m-%d %H:%M:%S'(GMT) 또는 간단히date -r 1278999698
Tom McKenzie

Ubuntu 16.04에서 작동
Mike Q

24

이 솔루션은 date -d @. AWK 또는 기타 명령이 필요하지 않습니다 . Unix 타임 스탬프는 1970 년 1 월 1 일 UTC 이후의 초 수이므로 UTC를 지정하는 것이 중요합니다.

date -d '1970-01-01 1357004952 sec UTC'
Mon Dec 31 17:49:12 PST 2012

Mac을 사용하는 경우 다음을 사용하십시오.

date -r 1357004952

시대를 얻기위한 명령 :

date +%s
1357004952

Anton의 크레딧 : BASH : Unix 타임 스탬프를 날짜로 변환


10

@TomMcKenzie가 다른 답변에 대한 의견에서 말했듯이, date -r 123456789 이 Unix Epoch 이후 몇 초 동안 주어진 시간 동안 더 일반적으로 (즉 더 널리 구현 된) 간단한 솔루션이지만 불행히도 보편적으로 보장되는 휴대용 솔루션은 없습니다.

-d시스템의 여러 유형에 대한 옵션은 GNU 날짜보다는 완전히 다른 무언가 의미 --date확장을. 슬프게도 GNU Date는 -r이러한 다른 구현과 동일하게 해석하지 않습니다 . 안타깝게도 어떤 버전을 date사용 하고 있는지 알아야합니다.date 명령이 두 옵션 중 하나를 지원하지 않습니다.

설상가상으로 POSIX 는 명령 줄에서 Unix 시간을 형식화하기 위해 (내가 알고있는) 명령에서 표준 방법을 전혀 date인식하지도 제공 하지도 -d않으며 -r제공 하지도 않습니다 (POSIX Awk에도 strftime(). (당신은 사용할 수 없습니다 touch -tls 이전 때문에 유닉스 신기원 이후의 초로 주어진 시간을 허용하지 않습니다.)

Brian Kernighan에서 직접 사용할 수있는 The One True Awk에는 이제 Unix Epoch 이후 현재 시간을 초 단위로 반환 strftime()하는 systime()함수 뿐만 아니라 함수가 내장 되어 있으므로 Awk 솔루션이 가장 이식성이 뛰어납니다.


4

표기법이 이상 -R하다고 생각되면 -옵션이 도움이 될 수 있습니다. RFC 2822 형식으로 날짜를 능가합니다. 따라서 모든 식별자가 필요하지는 않습니다 date -d @1278999698 -R.. 또 다른 가능성은 로케일로 날짜를 초 단위로 출력하는 것입니다 : date -d @1278999698 +%c. 기억하기 쉬워야합니다. :-)


2

위의 dabest1의 답변에 약간의 수정. 시간대를 GMT가 아닌 UTC로 지정합니다.

$ date -d '1970-01-01 1416275583 sec GMT'
Tue Nov 18 00:53:03 GMT 2014
$ date -d '1970-01-01 1416275583 sec UTC'
Tue Nov 18 01:53:03 GMT 2014

두 번째가 맞습니다. 그 이유는 영국에서 일광 절약이 1968 년부터 1971 년까지 지속적으로 시행 되었기 때문이라고 생각합니다.


2

표준 Perl 솔루션은 다음과 같습니다.

echo $TIMESTAMP | perl -nE 'say scalar gmtime $_'

(또는 선호하는 경우 현지 시간)


1
awk 'BEGIN { print strftime("%c", 1271603087); }'

1

여기에있는 다른 예는 기억하기 어렵습니다. 가장 간단하게 :

date -r 1305712800

혼합 결과 : 우분투 Linux에서는 작동하지 않지만 Mac OS X에서는 작동합니다.
Mike Q

1

~ / .bashrc에 다음을 입력하십시오.

function unixts() { date -d "@$1"; }

사용 예 :

$ unixts 1551276383

Wed Feb 27 14:06:23 GMT 2019

-1

파이썬 :

python -c "from datetime import datetime; print(datetime.fromtimestamp($TIMESTAMP))"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.