Bash에서 타임 스탬프를 날짜로 변환하는 방법은 무엇입니까?


270

유닉스 타임 스탬프를 날짜로 변환하는 쉘 명령이나 스크립트가 필요합니다. 입력은 첫 번째 매개 변수 또는 stdin에서 가져올 수 있으며 다음 사용 패턴을 허용합니다.

ts2date 1267619929

echo 1267619929 | ts2date

두 명령 모두 "Wed Mar 3 13:38:49 2010"을 출력해야합니다.

답변:


531

일반적인 Linux 배포판의 이후 버전에서는 다음을 사용할 수 있습니다.

date -d @1267619929

5
원 라이너 :date -d @$(date -u +%s)
Mike Atlas

26
무엇입니까 @? 나는 GNU man 페이지에서 전혀 보지 못했습니다.
Mark E. Haase 3

13
@mehaase - 날짜 문자열은이 정보에 설명되어 있으므로, 맨 페이지에 설명하기에는 너무 복잡하다는 맨 페이지 참고 : 정보 '(로 coreutils) 날짜 호출'
MByD

10
brew install coreutils; gdate -d @1267619929
마크 폭스

2
info 'Date input formats'date적절한 Robert Grudin 따옴표와 서식 지정자 메뉴를 사용하여의 서식 정보 노드로 바로 이동 합니다.
mike

165
date -r <number>

Mac OS X에서 작동합니다.


5
예, 그러나 1 초의 일부만 처리하지는 않습니다.
mgold

1
freddy @ hades ~ % date --help | 다음과 같은 이유로 대부분의 Linux 시스템에서 작동하지 않기 때문에 혼란 스럽습니다. grep--r -r, --reference = FILE FILE의 마지막 수정 시간 표시
frank42

1
이 답변에 대한 의견은 사실이지만, 이것은 rafa의 잘못이 아니며, 그의 답변을 감소시키지 않습니다.
mike

29

이 버전은 chiborg의 답변 과 비슷 하지만 외부 tty및 의 필요성을 제거합니다 cat. 사용 date하지만 쉽게 사용할 수 있습니다 gawk. shebang을 변경하고 이중 대괄호를 단일 대괄호로 바꿀 수 있습니다 sh.

#!/bin/bash
LANG=C
if [[ -z "$1" ]]
then
    if [[ -p /dev/stdin ]]    # input from a pipe
    then
        read -r p
    else
        echo "No timestamp given." >&2
        exit
    fi
else
    p=$1
fi
date -d "@$p" +%c

+1 : 매우 완전한 답변이며 날짜가 gawk보다 빠르다고 생각합니다.
Bruno Brant

@Bruno, 날짜가 gawk보다 빠르다는 것을 어떻게 알 수 있습니까?
ghostdog74

3
@Bruno, @ ghostdog74 : 내 시스템에서 출력 만 또는 로 리디렉션 된 시간이 지정된 루프 gawk보다 15 % 빠릅니다 . dateforgawk 'BEGIN { print strftime("%c", 1256571985); }'date -d '@1256571985' +%c/dev/null
추후 공지가있을 때까지 일시 중지되었습니다.

1
날짜가 나를 위해 gawk보다 약간 (5 %) 빠릅니다 (mac osx 10.9.2, 날짜 8.23, gawk 4.1.1). 내 대답은 아래)와 같습니다. 예를 들어 스크립트는 1000 번 타임 스탬프에 대해 250 배 빠릅니다.
webb

3
내 답변은 질문에 명시된 OP의 요구 사항을 충족하지만 현재 인정되는 답변은 그렇지 않습니다.
추후 공지가있을 때까지 일시 중지되었습니다.

17

예를 들어 GNU 날짜를 사용할 수 있습니다.

$ sec=1267619929
$ date -d "UTC 1970-01-01 $sec secs"

또는

$ date -ud @1267619929

10

이 간단한 awk 스크립트를 사용할 수 있습니다.

#!/bin/gawk -f   
{ print strftime("%c", $0); }

샘플 사용법 :

$ echo '1098181096' | ./a.awk 
Tue 19 Oct 2004 03:18:16 AM PDT
$

이것은 첫 번째 사용법에 맞지 않습니다. 때로는 TS를 에코하고 대신 매개 변수를 사용하고 싶지 않습니다.
chiborg

일부 오래된 busybox 버전에서 date -s @작동하지 않으며 awk여전히 작동합니다! stdin이없는 예제도 도움이 될 것입니다.
Victor Sergienko

8

Bash 4.2부터 printf%(datefmt)T형식을 사용할 수 있습니다 .

$ printf '%(%c)T\n' 1267619929
Wed 03 Mar 2010 01:38:49 PM CET

쉘 내장이기 때문에 좋습니다. datefmt 의 형식은 strftime(3)(에서 참조 할 수 있는 문자열 man 3 strftime입니다. 여기 %c있습니다 :

%c 현재 로캘의 기본 날짜 및 시간 표현입니다.


이제 인수를 허용하고 아무것도 제공되지 않으면 stdin을 읽는 스크립트를 원하면 다음과 같이 진행할 수 있습니다.

#!/bin/bash

if (($#)); then
    printf '%(%c)T\n' "$@"
else
    while read -r line; do
        printf '%(%c)T\n' "$line"
    done
fi

6

로그 파일을 변환하거나 모니터링 할 때 이것을 사용합니다.

tail -f <log file> | gawk \
'{ printf strftime("%c", $1); for (i=2; i<NF; i++) printf $i " "; print $NF }'

내가 찾던 것을 정확히 단축 할 수 있습니다awk '{ printf strftime("%c: ", $1); $1 = ""; print $0; }'
ChrisWue

5

OSX 또는 BSD -r에는 유닉스 타임 스탬프가 필요한 동등한 플래그가 있습니다. 다음은 날짜를 네 번 실행하는 예입니다. 첫 번째 날짜에 한 번, 현재 날짜를 표시합니다. 를 사용하여 유닉스 타임 스탬프로 변환하기위한 것이고 %s, 마지막으로 를 사용하여 문자열로 다시 제공 -r하는 것을 변환하는 것 %s.

$  date; date +%s; date -r `date +%s`
Tue Oct 24 16:27:42 CDT 2017
1508880462
Tue Oct 24 16:27:42 CDT 2017

적어도 내 컴퓨터에서 작동하는 것 같습니다.

$ uname -a
Darwin XXX-XXXXXXXX 16.7.0 Darwin Kernel Version 16.7.0: Thu Jun 15 17:36:27 PDT 2017; root:xnu-3789.70.16~2/RELEASE_X86_64 x86_64

이미 타임 스탬프 값이 있고 동등한 날짜를 찾아야하는 경우 OS X에서는이를 명령 줄에 입력하면됩니다. date -r 1509453417
Noel

1
사실입니다. 내 대답을 보면 실제로 그것을 보여주고 있습니다.
다니엘 파렐

5

타임 스탬프에서 다음과 같이 형식이 지정된 날짜를 얻을 수 있습니다

date +'%Y-%m-%d %H:%M:%S' -d "@timestamp"

주변의 다른 방법 : 날짜 -ud "1585667718 @ '+'% Y- % M- % D % H %의 M %의 S '
AndiAna

3

나는 이것을 직접하는 스크립트를 작성했다.

#!/bin/bash
LANG=C
if [ -z "$1" ]; then
    if [  "$(tty)" = "not a tty" ]; then
            p=`cat`;
    else
            echo "No timestamp given."
            exit
    fi
else
    p=$1
fi
echo $p | gawk '{ print strftime("%c", $0); }'

1
질문 태그에 "bash"가 포함되지만 shebang에 "sh"가 있습니다.
추후 공지가있을 때까지 일시 중지되었습니다.

3

이 답변에서는 Dennis Williamson의 답변을 복사하고 스크립트에 여러 타임 스탬프 열을 파이핑 할 때 속도를 크게 높일 수 있도록 약간 수정합니다. 예를 들어, 내 컴퓨터에서 xargs -n1을 사용하여 1000 개의 타임 스탬프를 원본 스크립트에 파이핑하면이 수정 된 버전에서는 0.027이 아니라 6.929 초가 소요됩니다.

#!/bin/bash
LANG=C
if [[ -z "$1" ]]
then
    if [[ -p /dev/stdin ]]    # input from a pipe
    then
        cat - | gawk '{ print strftime("%c", $1); }'
    else
        echo "No timestamp given." >&2
        exit
    fi
else
    date -d @$1 +%c
fi

2

몇 가지 예 :

$ 날짜
화 3 월 22 일 16:47:06 CST 2016

$ date -d "화 3 월 22 일 16:47:06 CST 2016" "+ % s"
1458636426

$ 날짜 + % s
1458636453

$ 날짜 -d @ 1458636426
화 3 월 22 일 16:47:06 CST 2016

$ 날짜 --date = '@ 1458636426'
화 3 월 22 일 16:47:06 CST 2016



2

이 크로스 플랫폼 원 라이너를 사용합니다.

date -d @1267619929 2>/dev/null || date -r 1267619929

macOS 및 이후 버전의 공통 Linux 배포판 모두에서 작동해야합니다.


0

순수한 bash는 아니지만 다음 스크립트는 문자열에서 길이가 13 인 타임 스탬프를 perl을 사용하여 현지 시간대의 해당 날짜로 변환합니다.

timestamp_to_date.sh

#!/usr/bin/env bash
IT=$(cat /dev/stdin)
re='(.*)([0-9]{13})(.*)'
while [[ $IT =~ $re ]]; do
  TIMESTAMP=${BASH_REMATCH[2]}
  AS_DATE=$(echo "$TIMESTAMP" | perl -pe 's/([\d]{10})([\d]{3})/localtime $1/eg;')
  IT="${IT/$TIMESTAMP/$AS_DATE}"    
done
echo "$IT"

입력

{"timestamp":"1573121629939","level":"DEBUG","thread":"http-nio-15372-exec-3","logger":"org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor"}

산출

$ cat input | timestamp_to_date.sh

{"timestamp":"Thu Nov  7 06:13:49 2019","level":"DEBUG","thread":"http-nio-15372-exec-3","logger":"org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor"}

-8

PHP에서

$unix_time = 1256571985;

echo date("Y-m-d H:i:s",$unix_time)

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