Jak uzyskać datę zakończenia poprzedniego miesiąca na podstawie daty przetwarzania?
Przykłady:
- Data przetwarzania = 15jan2015
- Oczekiwana data = 31 grudnia 2014 r.,
- Data przetwarzania = 10 lutego 2015 r
- Oczekiwana data = 31jan2015
Jak uzyskać datę zakończenia poprzedniego miesiąca na podstawie daty przetwarzania?
Przykłady:
Odpowiedzi:
Z GNU date:
$ date +%d%b%Y
16Aug2015
$ date -d "$(date +%Y-%m-01) -1 day" +%d%b%Y
31Jul2015
Niektóre powłoki mają wbudowaną obsługę manipulacji datami:
Z ksh93:
$ printf "%(%d%b%Y)T\n" "1st day, yesterday"
31Jul2015
Z zsh:
$ zmodload zsh/datetime
$ strftime -s d %Y-%m-01-12 $EPOCHSECONDS
$ strftime -rs d %Y-%m-%d-%H $d
$ strftime %d%b%Y $((d-86400))
31Jul2015
Jest na to wiele sposobów ; oto najprostszy, jaki znalazłem (tutaj przy założeniu GNU date):
$ date -d "-$(date +%d) days"
Fri Jul 31 16:07:23 EDT 2015
TZ=Pacific/Apia faketime '2011-12-31 12:00' date -d '1 day ago'. Wystąpił błąd, ponieważ nie było tam 30.12.2011. Oznacza to, że przesunięcie dnia zostało wykonane w czasie kalendarzowym. 2011-12-31 minus 31 dni daje ci 2011-11-30, ponieważ bierze 31 z 31. Nie bierze 31 * 24 * 60 * 60 * 60 sekund z bieżącego czasu. Porównaj z tym, TZ=Pacific/Apia faketime '2011-12-31 12:00' date -d '24 hour ago'co daje ci 29., czyli tym razem datę, która była 24 * 60 * 60 * 60 sekund temu.
Oto wersja działająca w systemie Mac OS, która korzysta z datenarzędzia BSD :
date -v1d -v-1d +%d%b%Y
Argumenty są stosowane w kolejności. Możesz sobie wyobrazić, że data jest przekazywana z jednego argumentu do drugiego. Na przykład:
date) -> 2017-03-06-v1d) -> 2017-03-01-v-1d)-> 2017-02-28+%d%b%Y) -> 28 lutego 2017Możesz dotrzeć do dowolnej liczby miesięcy do przodu lub do tyłu date -v-1m -v1d -v-1d, zastępując -1mją liczbą miesięcy do tyłu lub do przodu ( +1m), którą chcesz.
To ogólna odpowiedź. To pytanie dotyczy konkretnie dat względem daty początkowej. Narzędzie daty w systemie Mac OS / BSD nie pozwala na dostarczenie znacznika danych na początek, ale każdy element daty można ustawić osobno:
date -v2015y -v1m -v15d -v1d -v-1d +%d%b%Y -> 31 grudnia 2014 r
Spróbuj użyć tego kodu
date -d "-$(date +%d) days month" +%Y-%m-%d