Do użytku w systemie Ubuntu z funkcją daty: $ (data +% Y:% m:% d -d "1 dzień temu"), wynik to: 2013: 04: 21. A jeśli chcesz mieć datę 10 dni wcześniej, możesz użyć $ (data +% Y:% m:% d -d "10 dni temu") lub $ (data +% Y:% m:% d -d "10 dzień temu ”)
Ta funkcja bash będzie działać zarówno w systemie Linux, jak i OSX. Zasadniczo najpierw próbuje stylu GNU Linux. Jeśli to się nie powiedzie, spróbuje stylu OSX. Nazwij to z argumentem liczby dni w przeszłości, w których chcesz ustawić datę. Jeśli nie podasz żadnego argumentu, przyjmiemy 0 dni. Ten kod jest jednolinijkowy, więc wycinanie i wklejanie powinno działać - nie zakłada się zakończenia linii. 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
Jeśli masz BSD (OSX) date, możesz to zrobić w ten sposób:
date -j -v-1dWedDec1415: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
Błędy w systemie macOS Sierra:date: illegal option -- -
kuanb
2
Musisz zainstalować wersję GNU date, dostępną w coreutilspakiecie, 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ą gdatepolecenia. Zobacz: topbug.net/blog/2013/04/14/…
sumitsu
17
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
#!/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=12fiset`cal $month $year`
xday=${$#}
day=`expr $xday + $day`fi
echo $year-$month-$day
+1 za korektę, ciekawa metoda, chociaż jest trochę rozwlekła.
Peter Lindqvist
1
Cześć medoix, nie jestem w stanie znaleźć znaczenia $ {$ #}. Wiem, że $ # oznacza liczbę argumentów skryptu / funkcji. Ale nie mogę się do tego odnieść. Proszę pomóż.
Karthick S
To nie działa dla poprzedniego dnia przy zmianie miesiąca. Na przykład dzisiejszy 1 July , 2013wynik to wydrukowany wynik 2013-6-1347, podczas gdy oczekiwany wynik to2013-6-30
błędny.
Zamiast 3 linii między „fi” try „day = echo $(cal $month $year)|tr ' ' '\n'|tail -n 1”
Anton Roslov
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 ;-)
To skutkuje date: illegal option: -dSolarisem. Twoja odpowiedź, która opiera się na zakaz przenośnych rozszerzeniami GNU do POSIX-standardowego datenarzędzia do pytania o platformie zakaz GNU Solaris.
Andrew Henle
0
Wypróbuj poniższy kod, który zajmie się również częścią DST.
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
lub-d
jest dostępna tylko w dniu GNUOdpowiedzi:
jeśli masz datę GNU i dobrze cię zrozumiałem
lub
źródło
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:Lub jeśli chcesz wykonać obliczenia daty w dowolnym dniu:
źródło
źródło
date: illegal option -- -
date
, dostępną wcoreutils
pakiecie, aby ta składnia działała w systemie macOS. Jeśli używasz Homebrew, możesz go zainstalować przezbrew 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ę:
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,
Więcej informacji: https://www.cyberciti.biz/tips/linux-unix-get-yesterdays-tomorrows-date.html
źródło
Cóż, to późna odpowiedź, ale wydaje się, że działa !!
źródło
Zaawansowany przewodnik po skryptach Bash
Aby uzyskać szczegółowe informacje na temat formatu daty, zobacz stronę podręcznika dotyczącą daty
źródło
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.
źródło
bash $(TZ=America/New_York date +%Y-%m-%d)
Może zamiast tego użyć Perla?
Lub użyj nawk i (ab) użyj / usr / bin / adb:
Przeszedłem też przez to ... szaleństwo!
źródło
źródło
Wstawia wczorajszą datę w formacie RRRR-MM-DD do zmiennej
$yesterday
.źródło
źródło
1 July , 2013
wynik to wydrukowany wynik2013-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”:
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 ;-)
źródło
lub
źródło
date: illegal option: -d
Solarisem. Twoja odpowiedź, która opiera się na zakaz przenośnych rozszerzeniami GNU do POSIX-standardowegodate
narzędzia do pytania o platformie zakaz GNU Solaris.Wypróbuj poniższy kod, który zajmie się również częścią DST.
Courtsey Ansgar Wiechers
źródło
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.
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ą:
źródło
Niezbyt seksowne, ale może wystarczyć:
Utworzone na podstawie odpowiedzi „Martin Clayton”.
źródło
źródło