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 -t및ls 이전 때문에 유닉스 신기원 이후의 초로 주어진 시간을 허용하지 않습니다.)

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.