Bash에서 날짜 시간 문자열을 epoch로 변환


94

날짜 시간 문자열은 다음 형식입니다. 06/12/2012 07:21:22. UNIX 타임 스탬프 또는 에포크로 변환하려면 어떻게해야합니까?

답변:


95

당신이 찾고있는 것은입니다 date --date='06/12/2012 07:21:22' +"%s". 이것은 GNU coreutils를 사용하고 있다고 가정합니다 --date.%s 형식 문자열은 모두 GNU 확장 . POSIX는 둘 중 하나를 지정하지 않으므로 POSIX 호환 시스템에서도 이러한 변환을 수행하는 이식 가능한 방법이 없습니다.

의 다른 버전에 대해서는 해당 매뉴얼 페이지를 참조하십시오 date.

참고 : bash --date-doption은 날짜를 US 또는 ISO8601 형식 (예 : UK, EU 또는 기타 형식이 아닌 mm/dd/yyyy또는) 으로 예상 yyyy-mm-dd합니다.


9
Mac OSX 10.8.2에서 실행할 때 'date : illegal option-'이 표시됩니다.
Ben Clayton

6
나와 같은 멍청이 +"%s"는 출력 형식을 의미하며 %s1970 년 이후 초 단위의 시간 형식입니다
razz

2
참고 : 다른 시간대 (예 : UTC)로 시간을 지정하려면 끝에 -HHMM 또는 + HHMM을 추가하십시오. 따라서 date --date='06/12/2012 07:21:22 -0000' +"%s"UTC 날짜를 유닉스 타임 스탬프로 변환
Greg Bray

GNU 날짜를 들어, 형식이라고 UTC 노트를 사용하고자하는 경우 yyyy-mm-dd hh:mm:ss한 번 봐 가지고 gnu.org/software/coreutils/manual/html_node/...을 :gdate --date='2019-06-18 00:02:00 +0000' +%s
아슈 JINDAL

Mac에서 작동하지 않습니다 ... Mac과 Linux 모두에서 작동하는 방법이 있는지 궁금합니다
nonopolarity

49

Linux의 경우이 명령을 실행하십시오.

date -d '06/12/2012 07:21:22' +"%s"

Mac OSX의 경우 다음 명령을 실행하십시오.

date -j -u -f "%a %b %d %T %Z %Y" "Tue Sep 28 19:35:15 EDT 2010" "+%s"

1
OSX에서 타임 스탬프는 현재 시간과 함께 어떻게 든 증가합니다. 나는 현재 그것에 대한 설명이 없습니다 ...
polym

3
업데이트 : 그것은 내 생각에 현지 시간에 대한 타임 스탬프를 조정하기 때문 -u입니다. 플래그를 추가하면 문제가 해결됩니다.
polym

@AbdulRehmanJanjua -u플래그가 와야 하기 전에-f 다른 쉘 해석을 플래그 또는 형식 문자열. 그래서, 그것은해야한다 :date -j -u -f "%a..."

4
macOS 터미널에 정확히 붙여 넣으면 실패합니다.
zneak

7
date -jf "%Y-%m-%d %H:%M:%S" "2018-01-08 14:45:00" +%s
daviestar

10

이러한 답변 중 상당수는 지나치게 복잡하고 변수 사용 방법이 누락되었습니다. 다음은 표준 Linux 시스템에서 더 간단하게 수행하는 방법입니다 (이전에 언급했듯이 Mac 사용자의 경우 date 명령을 조정해야 함).

샘플 스크립트 :

#!/bin/bash
orig="Apr 28 07:50:01"
epoch=$(date -d "${orig}" +"%s")
epoch_to_date=$(date -d @$epoch +%Y%m%d_%H%M%S)    

echo "RESULTS:"
echo "original = $orig"
echo "epoch conv = $epoch"
echo "epoch to human readable time stamp = $epoch_to_date"

결과 :

RESULTS:
original = Apr 28 07:50:01
epoch conv = 1524916201 
epoch to human readable time stamp = 20180428_075001

또는 함수로 :

# -- Converts from human to epoch or epoch to human, specifically "Apr 28 07:50:01" human.
#    typeset now=$(date +"%s")
#    typeset now_human_date=$(convert_cron_time "human" "$now")

function convert_cron_time() {
    case "${1,,}" in
        epoch)
            # human to epoch (eg. "Apr 28 07:50:01" to 1524916201)
            echo $(date -d "${2}" +"%s")
            ;;
        human)
            # epoch to human (eg. 1524916201 to "Apr 28 07:50:01")
            echo $(date -d "@${2}" +"%b %d %H:%M:%S")
            ;;
    esac
}

3
get_curr_date () {
    # get unix time
    DATE=$(date +%s)
    echo "DATE_CURR : "$DATE
}

conv_utime_hread () {
    # convert unix time to human readable format
    DATE_HREAD=$(date -d @$DATE +%Y%m%d_%H%M%S)
    echo "DATE_HREAD          : "$DATE_HREAD
}

5
Stack Overflow에 오신 것을 환영합니다. 코드에 추가로 설명을 추가해보십시오.
Olivier De Meulder 2015

2

백그라운드 전용 프로세스date 로 사용 하는 효율적인 솔루션

이런 종류의 번역을 훨씬 더 빠르게 하기 위해 ...

소개

이 게시물에서는

  • 다음 은 Quick Demo입니다 .
  • 일부 설명 ,
  • 기능 많은 가능한 취소 * X 도구 ( bc, rot13, sed...).

빠른 데모

fifo=$HOME/.fifoDate-$$
mkfifo $fifo
exec 5> >(exec stdbuf -o0 date -f - +%s >$fifo 2>&1)
echo now 1>&5
exec 6< $fifo
rm $fifo
read -t 1 -u 6 now
echo $now

현재 UNIXTIME을 출력해야합니다 . 거기에서 비교할 수 있습니다

time for i in {1..5000};do echo >&5 "now" ; read -t 1 -u6 ans;done
real    0m0.298s
user    0m0.132s
sys     0m0.096s

과:

time for i in {1..5000};do ans=$(date +%s -d "now");done 
real    0m6.826s
user    0m0.256s
sys     0m1.364s

6 초 이상 ~ 0.5 초 미만 !! (내 호스트에서).

당신은 확인할 수 있습니다 echo $ans교체 "now"에 의해"2019-25-12 20:10:00" .

선택적으로 날짜 하위 프로세스가 종료 되면 다음을 수행 할 수 있습니다 .

exec 5>&- ; exec 6<&-

원본 게시물 (상세 설명)

변환 할 날짜별로 1 개의 포크 를 실행하는 대신 , 한 date번만 실행 하고 동일한 프로세스로 모든 변환을 수행하십시오 (훨씬 빨라질 수 있음) !:

date -f - +%s <<eof
Apr 17  2014
May 21  2012
Mar  8 00:07
Feb 11 00:09
eof
1397685600
1337551200
1520464020
1518304140

견본:

start1=$(LANG=C ps ho lstart 1)
start2=$(LANG=C ps ho lstart $$)
dirchg=$(LANG=C date -r .)
read -p "A date: " userdate
{ read start1 ; read start2 ; read dirchg ; read userdate ;} < <(
   date -f - +%s <<<"$start1"$'\n'"$start2"$'\n'"$dirchg"$'\n'"$userdate" )

이제 살펴보십시오.

declare -p start1 start2 dirchg userdate

(다음과 같이 대답 할 수 있습니다.

declare -- start1="1518549549"
declare -- start2="1520183716"
declare -- dirchg="1520601919"
declare -- userdate="1397685600"

이것은 한 번의 실행으로 이루어졌습니다!

사용하여 긴 실행 서브 프로세스를

하나의 fifo 가 필요합니다 .

mkfifo /tmp/myDateFifo
exec 7> >(exec stdbuf -o0 /bin/date -f - +%s >/tmp/myDateFifo)
exec 8</tmp/myDateFifo
rm /tmp/myDateFifo

(참고 : 프로세스가 실행 중이고 모든 디스크립터가 열리면 fifo의 파일 시스템 항목을 안전하게 제거 할 수 있습니다.)

이제 :

LANG=C ps ho lstart 1 $$ >&7
read -u 8 start1
read -u 8 start2
LANG=C date -r . >&7
read -u 8 dirchg

read -p "Some date: " userdate
echo >&7 $userdate
read -u 8 userdate

우리는 약간의 기능을 구축 할 수 있습니다.

mydate() {
    local var=$1;
    shift;
    echo >&7 $@
    read -u 8 $var
}

mydate start1 $(LANG=C ps ho lstart 1)
echo $start1

또는 newConnector 기능 사용

기능 에 대한 연결 MySQL/MariaDB , PostgreSQLSQLite ...

GitHub 또는 내 사이트 에서 다른 버전에서 찾을 수 있습니다. 다운로드 또는 표시 .

wget https://raw.githubusercontent.com/F-Hauri/Connector-bash/master/shell_connector.bash

. shell_connector.bash 
newConnector /bin/date '-f - +%s' @0 0

myDate "2018-1-1 12:00" test
echo $test
1514804400

NOTA :GitHub의 , 기능 및 테스트 파일을 분리된다. 에 내 사이트에 이 스크립트가되지 않은 경우 테스트 간단하게 실행되는 소스 .

# Exit here if script is sourced
[ "$0" = "$BASH_SOURCE" ] || { true;return 0;}

2

사용하려는 시간대를 확인하십시오.

datetime="06/12/2012 07:21:22"

가장 널리 사용되는 용도는 시스템 시간대가 필요합니다.

date -d "$datetime" +"%s" #depends on local timezone, my output = "1339456882"

그러나 의도적으로 UTC datetime을 전달하고 적절한 시간대를 원하는 경우 -u플래그 를 추가해야합니다 . 그렇지 않으면 현지 시간대에서 변환합니다.

date -u -d "$datetime" +"%s" #general output = "1339485682"

내 날짜 형식이 "YYYYmmdd"이면 어떻게됩니까? 전의. 20200827
Mayur Gite

당신도 그것을 사용할 수 있습니다. date이 입력을 올바르게 형식화하십시오.
Tajni
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.