쉘 스크립트의 YYYY-MM-DD 형식 날짜


1109

$(date)bash 쉘 스크립트에서 사용하려고 시도했지만 날짜 YYYY-MM-DD형식을 원합니다 .
이걸 어떻게 얻습니까?

답변:


1828

bash (> = 4.2)에서는 외부 date(보통 GNU 날짜) 대신 printf의 내장 날짜 형식 기 (bash의 일부)를 사용하는 것이 좋습니다 .

따라서 :

# put current date as yyyy-mm-dd in $date
# -1 -> explicit current date, bash >=4.3 defaults to current time if not provided
# -2 -> start time for shell
printf -v date '%(%Y-%m-%d)T\n' -1 

# put current date as yyyy-mm-dd HH:MM:SS in $date
printf -v date '%(%Y-%m-%d %H:%M:%S)T\n' -1 

# to print directly remove -v flag, as such:
printf '%(%Y-%m-%d)T\n' -1
# -> current date printed to terminal

bash (<4.2)에서 :

# put current date as yyyy-mm-dd in $date
date=$(date '+%Y-%m-%d')

# put current date as yyyy-mm-dd HH:MM:SS in $date
date=$(date '+%Y-%m-%d %H:%M:%S')

# print current date directly
echo $(date '+%Y-%m-%d')

다른 사용 가능한 날짜 형식은 날짜 매뉴얼 페이지 에서 볼 수 있습니다 (bash 이외의 외부 명령의 경우).

man date

4
매월 1 일에 OP가 요청한 것이 아닌 "2012-07-1"이 표시됩니다.
DerMike

6
이것은 나를 위해 작동합니다. 맨 페이지에서는 해당 월의 첫 번째가 01, no 1 (예 : 2012-07-01)임을 제안합니다.
밥 쿠 하르

31
DATE = $ (날짜 + % d- % m- % Y ""% H : % M : % S); 내가 끝낸 것.
JacopKane

5
이 바로 가기가 얼마나 광범위하게 사용 가능한지 확인하지 않았지만 일부 배포에서는 +%F %T에 대한 바로 가기로 사용할 수 있습니다 +%Y-%m-%d %H:%M:%S. 것을 그냥 참고 일부 파일 시스템 (기침 ** HFS)가 변환됩니다 :A를 /당신에게 같은 문자열을 제공 2016-09-15 11/05/00하는 혼란 강력한입니다.
beporter

24
이 밀레니엄의 POSIX 호환 쉘에서 선호되는 구문은 date=$(date)대신입니다 date=`date`. 또한 개인 변수에 대문자를 사용하지 마십시오. 대문자 변수 이름은 시스템 용으로 예약되어 있습니다.
tripleee

335

시험: $(date +%F)


12
날짜에 대한 매뉴얼 페이지는 다음과 같습니다. % F full date; % Y- % m- % d와 동일하므로 허용되는 답변에 대한 더 간단한 표기법입니다.
Håvard Geithus

92

다음과 같이 할 수 있습니다 :

$ date +'%Y-%m-%d'

47

ISO 8601 표준 날짜 형식을 찾고 있으므로 GNU 날짜 (또는 1988보다 최신 날짜 명령)가있는 경우 다음을 수행하십시오.$(date -I)


9
최근에 (> 1988) Mac OS X 컴퓨터가 있는데 date -I작동하지 않았습니다. 접두사 'g'를 사용하는 brew 를 사용 하여 GNU coreutils 를 설치 하면 작동합니다. gdate -I
Joel Purra

3
이상한. -IGNU date에 대해 문서화 된 옵션을 찾을 수는 없지만 충분하다는 것은 확실합니다 date +%F.
chepner

3
OS X은 일반적으로 GPL v3 황무지이므로 최근에 업데이트 된 날짜 나 BASH가 아닐 수도 있습니다.
Indolering

20
date -d '1 hour ago' '+%Y-%m-%d'

출력은입니다 2015-06-14.


3
몇 가지 이유로 잘못되었습니다. 분명히 이것은 00:00과 01:00 사이의 잘못된 날짜를 제공하며, 게다가으로 끝납니다 %.
Gerhard Burger

그것은 사실이 아닙니다. 이 희소 한 따옴표와 같아야합니다
Beyhan Gül

20
$(date +%F_%H-%M-%S)

사이에 콜론 (:)을 제거하는 데 사용할 수 있습니다.

산출

2018-06-20_09-55-58

19

최근 Bash (버전 ≥ 4.2)에서는 printfformat 수정 자와 함께 내장 기능 을 사용할 수 있습니다 %(strftime_format)T.

$ printf '%(%Y-%m-%d)T\n' -1  # Get YYYY-MM-DD (-1 stands for "current time")
2017-11-10
$ printf '%(%F)T\n' -1  # Synonym of the above
2017-11-10
$ printf -v date '%(%F)T' -1  # Capture as var $date

printfdateBash 내장이기 때문에 date외부 명령 이므로 훨씬 빠릅니다 .

또한 서브 쉘을 포크 할 필요가 없으므로 printf -v date ...보다 빠릅니다 date=$(printf ...).


4
2019 년에 참고로,이 명령은 date추가 라이브러리를로드 할 필요가 없기 때문에 이미 bash 스크립트 내 에서이 명령 을 사용하는 것보다 훨씬 빠릅니다 * . (* 나는 리눅스 서버에서 1000 회 이상 반복되는 속도의 ~ 160x 속도 차이를 측정했다)
timtj

@timtj 지적 해 주셔서 감사합니다! 답변에 속도에 대한 메모를 추가했습니다.
wjandrea

1
printf -v date서브 쉘을 포크하지 않는 것에 대한 의견을 +5 할 수 있기를 바랍니다 . 아주 좋은 정보 !!
timtj

일반적으로 날짜를 사용하므로 일부 날짜를 통해 증가해야합니다. printf는 날짜 산술을 할 수 있습니까?
멀린

1
@Merlin 나는 그렇게 생각하지 않습니다
wjandrea

8

내가 이런 일을 할 때마다 나는 다시

$ man strftime

모든 가능성을 생각 나게합니다.


7

연도가 2017이 아닌 17과 같은 두 숫자 형식으로 원하는 경우 다음을 수행하십시오.

DATE=`date +%d-%m-%y`

6
#!/bin/bash -e

x='2018-01-18 10:00:00'
a=$(date -d "$x")
b=$(date -d "$a 10 min" "+%Y-%m-%d %H:%M:%S")
c=$(date -d "$b 10 min" "+%Y-%m-%d %H:%M:%S")
#date -d "$a 30 min" "+%Y-%m-%d %H:%M:%S"

echo Entered Date is $x
echo Second Date is $b
echo Third Date is $c

여기서 x는 사용 된 샘플 날짜입니다. 그리고 예제는 데이터 형식을 지정하고 현재 날짜보다 10 분 더 많은 날짜를 가져옵니다.


6

나는 다음 공식을 사용합니다 :

TODAY=`date -I`
echo $TODAY

에 대한 매뉴얼 페이지를 확인하십시오. date다른 유용한 옵션이 많이 있습니다.

man date

5

내가 사용 $(date +"%Y-%m-%d") 또는 $(date +"%Y-%m-%d %T")시간과 시간에.


1

날짜를 환경 변수로 설정하고 나중에 U를 사용할 수 있습니다

setenv DATE `date "+%Y-%m-%d"`
echo "----------- ${DATE} -------------"

또는

DATE =`date "+%Y-%m-%d"`
echo "----------- ${DATE} -------------"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.