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 date
narzę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 -1m
ją 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