Bash에서 날짜 (현재 시간 전날)를 가져옵니다.


171

Bash에서 현재 시간 전날의 날짜를 어떻게 인쇄합니까?


솔라리스 10의 떠들썩한 파티에는 -d 스위치가없는 것처럼 날짜를 시도하지만 보인다
conandor

sunfreeware에서 gnu date (coreutil 패키지)를 설치하여 또 다른 훌륭한 솔루션을 찾았습니다.
conandor

AIX 날짜에 -d 스위치도 없습니다.
Frankster

--date또는 -d옵션은 GNU 날짜에서만 사용할 수 있습니다
크리스 FA 존슨

이 질문의 DST 안전 버전은 stackoverflow.com/q/15374752/462865 를 참조하십시오 .
Amir Ali Akbari

답변:


262

GNU 날짜를 가지고 있고 당신을 올바르게 이해했다면

$ date +%Y:%m:%d -d "yesterday"
2009:11:09

또는

$ date +%Y:%m:%d -d "1 day ago"
2009:11:09

1
나는 대부분의 답변으로 제안되었지만 -d 스위치는 Solaris 날짜에서 찾을 수 없습니다
conandor

3
날짜 기능이있는 Ubuntu에서 사용하는 경우 : $ (date + % Y : % m : % d -d "1 일 전"), 출력은 2013 : 04 : 21입니다. 그리고 10 일 전에 날짜를 원하면 $ (date + % Y : % m : % d -d "10 일 전") 또는 $ (date + % Y : % m : % d -d "10 day ago ")
zhihong

OS X에서는 brew를 통해 coreutils를 설치할 수 있습니다 : stackoverflow.com/questions/15374752/…
kasterma

11
date -v-1dOSX에서 (빼기), -v+1d(플러스)
bgs

2
이 bash 기능은 Linux 및 OSX 모두에서 작동합니다. 기본적으로 GNU Linux 스타일을 먼저 시도합니다. 실패하면 OSX 스타일을 시도합니다. 과거의 날짜를 원하는 일 수의 인수로 호출하십시오. 인수를 전달하지 않으면 0 일로 가정합니다. 이 코드는 한 줄짜리 코드이므로 잘라 내기 및 붙여 넣기가 작동해야합니다. date_days_past () { days_past=${1:-0}; if ! date -v-${days_past}d +%Y%m%d 2>/dev/null; then date --date="-${days_past} day" +%Y%m%d; fi }
Noah Spurrier

50

BSD (OSX) date가 있다면 다음과 같이 할 수 있습니다 :

date -j -v-1d
Wed Dec 14 15:34:14 CET 2011

또는 임의의 날짜에 날짜 계산을 수행하려는 경우 :

date -j -v-1d -f "%Y-%m-%d" "2011-09-01" "+%Y-%m-%d"
2011-08-31

41
date --date='-1 day'

4
macOS Sierra의 date: illegal option -- -
Erros

2
이 구문이 macOS에서 작동하게 date하려면 coreutils패키지를 통해 사용 가능한 GNU 버전의을 설치해야합니다 . Homebrew를 사용하는 경우을 통해 설치할 brew install coreutils수 있으며 gdate명령을 통해 GNU 날짜를 사용할 수 있습니다 . 참조 : topbug.net/blog/2013/04/14/...
sumitsu


7

글쎄, 이것은 늦은 답변이지만 이것이 작동하는 것 같습니다!

     YESTERDAY=`TZ=GMT+24 date +%d-%m-%Y`;
     echo $YESTERDAY;


4

솔라리스 시스템에 대해 언급하지 않아서 죄송합니다. 따라서 -date 스위치는 Solaris bash에서 사용할 수 없습니다.

나는 시간대에 약간의 트릭으로 이전 날짜를 얻을 수 있다는 것을 알았습니다.

DATE=`TZ=MYT+16 date +%Y-%m-%d_%r`
echo $DATE

일광 절약 시간제를 사용하는 장소에 사는 경우이 방법은 100 % 신뢰할 수 없습니다 (실제로 약 98 %).
jlliagre

정확하게는 사용할 수 없습니다 bash $(TZ=America/New_York date +%Y-%m-%d)
phray2002

3

아마도 펄을 사용 하시겠습니까?

perl -e 'print scalar localtime( time - 86400 ) . "\n";'

또는 nawk 및 (ab) use / usr / bin / adb를 사용하십시오.

nawk 'BEGIN{printf "0t%d=Y\n", srand()-86400}' | adb

우연히 너무 ... 미친!

/usr/bin/truss /usr/bin/date 2>&1 | nawk -F= '/^time\(\)/ {gsub(/ /,"",$2);printf "0t%d=Y\n", $2-86400}' | adb


1
yesterday=`date -d "-1 day" %F`

어제 날짜를 YYYY-MM-DD 형식으로 variable에 넣습니다 $yesterday.


1
#!/bin/bash
OFFSET=1;
eval `date "+day=%d; month=%m; year=%Y"`
# Subtract offset from day, if it goes below one use 'cal'
# to determine the number of days in the previous month.
day=`expr $day - $OFFSET`
if [ $day -le 0 ] ;then
month=`expr $month - 1`
if [ $month -eq 0 ] ;then
year=`expr $year - 1`
month=12
fi
set `cal $month $year`
xday=${$#}
day=`expr $xday + $day`
fi
echo $year-$month-$day

약간 장황하지만 수정, 재미있는 방법으로 +1.
Peter Lindqvist 2018

1
안녕하세요 medoix, $ {$ #}의 의미를 찾을 수 없습니다. $ #는 스크립트 / 함수에 대한 인수의 수를 나타냅니다. 그러나 나는 이것과 관련이 없습니다. 도와주세요.
Karthick S

월 변경시 이전 날에는 작동하지 않습니다. 예를 들어 오늘은 1 July , 2013, 결과는 인쇄되고 2013-6-1347예상 된 결과 인 반면,2013-6-30
잘못

"fi"사이의 3 줄 대신 "day = echo $(cal $month $year)|tr ' ' '\n'|tail -n 1"를 시도하십시오
Anton Roslov

1

선택한 날짜 형식이 'YYYYMM'인 경우 정규 표현식으로 간단한 계산을 수행 할 수 있습니다.

echo $(($(date +"%Y%m") - 1)) | sed -e 's/99$/12/'

2020 년 1 월에는 201912를 반환합니다. ;-) 그러나 날짜에 계산 옵션이없고 다른 날짜 해석기 옵션 (예 : perl 사용)이없는 경우 해결 방법 일뿐입니다. ;-)



0

DST 부분을 관리하는 아래 코드를 사용해보십시오.

if [ $(date +%w) -eq $(date -u +%w) ]; then
  tz=$(( 10#$gmthour - 10#$localhour ))
else
  tz=$(( 24 - 10#$gmthour + 10#$localhour ))
fi
echo $tz
myTime=`TZ=GMT+$tz date +'%Y%m%d'`

코트 지 안스가 비에 커스


0

DST 인식 솔루션 :

시간대를 조작하면 몇 시간 동안 시계를 변경할 수 있습니다. 일광 절약 시간 제로 인해 24 시간 전이 오늘 또는 전날이 될 수 있습니다.

어제는 20 시간 또는 30 시간 전입니다. 어느 것? 글쎄, 오늘이 아닌 가장 최근의 것.

echo -e "$(TZ=GMT+30 date +%Y-%m-%d)\n$(TZ=GMT+20 date +%Y-%m-%d)" | grep -v $(date +%Y-%m-%d) | tail -1

echo 명령에 사용 된 -e 매개 변수는 bash와 함께 필요하지만 ksh에서는 작동하지 않습니다. ksh에서는 -e 플래그없이 동일한 명령을 사용할 수 있습니다.

다른 환경에서 스크립트를 사용하는 경우 #! / bin / ksh 또는 #! / bin / bash로 스크립트를 시작할 수 있습니다. \ n을 줄 바꿈으로 바꿀 수도 있습니다.

echo "$(TZ=GMT+30 date +%Y-%m-%d)
$(TZ=GMT+20 date +%Y-%m-%d)" | grep -v $(date +%Y-%m-%d) | tail -1

0

매우 섹시하지는 않지만 일을 할 수도 있습니다.

perl -e 'my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time - 86400);$year += 1900; $mon+= 1; printf ("YESTERDAY: %04d%02d%02d \n", $year, $mon, $mday)'

"마틴 클레이튼"답변에서 형식화되었습니다.


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