Jak mogę wydrukować datę, która jest dzień przed bieżącą godziną w Bash?
--date
lub -d
jest dostępna tylko w dniu GNU
Jak mogę wydrukować datę, która jest dzień przed bieżącą godziną w Bash?
--date
lub -d
jest dostępna tylko w dniu GNU
Odpowiedzi:
jeśli masz datę GNU i dobrze cię zrozumiałem
$ date +%Y:%m:%d -d "yesterday"
2009:11:09
lub
$ date +%Y:%m:%d -d "1 day ago"
2009:11:09
date -v-1d
na OSX (minus), -v+1d
(plus)
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 }
Jeśli masz BSD (OSX) date
, możesz to zrobić w ten sposób:
date -j -v-1d
Wed Dec 14 15:34:14 CET 2011
Lub jeśli chcesz wykonać obliczenia daty w dowolnym dniu:
date -j -v-1d -f "%Y-%m-%d" "2011-09-01" "+%Y-%m-%d"
2011-08-31
date --date='-1 day'
date: illegal option -- -
date
, dostępną w coreutils
pakiecie, aby ta składnia działała w systemie macOS. Jeśli używasz Homebrew, możesz go zainstalować przez brew install coreutils
, po czym powinieneś być w stanie użyć daty GNU za pomocą gdate
polecenia. Zobacz: topbug.net/blog/2013/04/14/…
MAC OS X
Na wczorajszą datę:
date -v-1d +%F
gdzie 1d oznacza bieżący dzień minus 1 dzień. Podobnie,
date -v-1w +% F - dla daty z poprzedniego tygodnia
date -v-1m +% F - dla daty poprzedniego miesiąca
JEŚLI MASZ DATĘ GNU,
date --date="1 day ago"
Więcej informacji: https://www.cyberciti.biz/tips/linux-unix-get-yesterdays-tomorrows-date.html
Zaawansowany przewodnik po skryptach Bash
date +%Y:%m:%d -d "yesterday"
Aby uzyskać szczegółowe informacje na temat formatu daty, zobacz stronę podręcznika dotyczącą daty
date --date='-1 day'
Przepraszam, że nie wspominam o mnie w systemie Solaris. W związku z tym przełącznik -date nie jest dostępny w systemie Solaris bash.
Dowiedziałem się, że mogę uzyskać poprzednią datę za pomocą małej sztuczki w strefie czasowej.
DATE=`TZ=MYT+16 date +%Y-%m-%d_%r`
echo $DATE
bash $(TZ=America/New_York date +%Y-%m-%d)
Może zamiast tego użyć Perla?
perl -e 'print scalar localtime( time - 86400 ) . "\n";'
Lub użyj nawk i (ab) użyj / usr / bin / adb:
nawk 'BEGIN{printf "0t%d=Y\n", srand()-86400}' | adb
Przeszedłem też przez to ... szaleństwo!
/usr/bin/truss /usr/bin/date 2>&1 | nawk -F= '/^time\(\)/ {gsub(/ /,"",$2);printf "0t%d=Y\n", $2-86400}' | adb
date --date='-1 day'
#!/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 July , 2013
wynik to wydrukowany wynik 2013-6-1347
, podczas gdy oczekiwany wynik to2013-6-30
echo $(cal $month $year)|tr ' ' '\n'|tail -n 1
”
Możesz wykonać proste obliczenia, uzupełnione wyrażeniem regularnym, jeśli wybrany format daty to „RRRRMM”:
echo $(($(date +"%Y%m") - 1)) | sed -e 's/99$/12/'
W styczniu 2020 zwróci 201912 ;-) Ale to tylko obejście, gdy data nie ma opcji obliczeniowych, a inne opcje interpretatora daty (np. Przy użyciu perla) nie są dostępne ;-)
date -d "yesterday" '+%Y-%m-%d'
lub
date=$(date -d "yesterday" '+%Y-%m-%d')
echo $date
date: illegal option: -d
Solarisem. Twoja odpowiedź, która opiera się na zakaz przenośnych rozszerzeniami GNU do POSIX-standardowego date
narzędzia do pytania o platformie zakaz GNU Solaris.
Wypróbuj poniższy kod, który zajmie się również częścią 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'`
Courtsey Ansgar Wiechers
Rozwiązanie uwzględniające czas letni:
Manipulowanie strefą czasową jest możliwe w celu zmiany zegara o kilka godzin. Ze względu na czas letni, 24 godziny temu może być dzisiaj lub przedwczoraj.
Jesteś pewien, że wczoraj było 20 lub 30 godzin temu. Który? Cóż, najnowszy, którego nie ma dzisiaj.
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
Parametr -e użyty w poleceniu echo jest potrzebny w bash, ale nie będzie działał z ksh. W ksh możesz użyć tego samego polecenia bez flagi -e.
Gdy twój skrypt będzie używany w różnych środowiskach, możesz uruchomić skrypt za pomocą #! / Bin / ksh lub #! / Bin / bash. Możesz także zastąpić \ n nową linią:
echo "$(TZ=GMT+30 date +%Y-%m-%d)
$(TZ=GMT+20 date +%Y-%m-%d)" | grep -v $(date +%Y-%m-%d) | tail -1
date +%Y:%m:%d|awk -vFS=":" -vOFS=":" '{$3=$3-1;print}'
2009:11:9