Come posso ottenere la data di fine del mese precedente, in base alla data di elaborazione?
Esempi:
- Data di elaborazione = 15jan2015
- Data prevista = 31dec2014,
- Data di elaborazione = 10feb2015
- Data prevista = 31jan2015
Come posso ottenere la data di fine del mese precedente, in base alla data di elaborazione?
Esempi:
Risposte:
Con GNU date:
$ date +%d%b%Y
16Aug2015
$ date -d "$(date +%Y-%m-01) -1 day" +%d%b%Y
31Jul2015
Alcune shell hanno il supporto integrato per la manipolazione della data:
Con ksh93:
$ printf "%(%d%b%Y)T\n" "1st day, yesterday"
31Jul2015
Con 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
Ci sono molti modi per farlo; ecco il più semplice che ho trovato (assumendo qui 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'. Viene visualizzato un errore perché non è presente il 30-12-2011. Cioè, l' offset del giorno è stato fatto sull'ora del calendario. 2011-12-31 meno 31 giorni ti dà 30/11/2011 perché richiede 31 di 31. Non ci vogliono 31 * 24 * 60 * 60 * 60 secondi di tempo corrente. Confronta con TZ=Pacific/Apia faketime '2011-12-31 12:00' date -d '24 hour ago'quale ti dà il 29, cioè questa volta, la data che era 24 * 60 * 60 * 60 secondi fa.
Ecco una versione che funziona su Mac OS, che utilizza l' dateutilità BSD :
date -v1d -v-1d +%d%b%Y
Gli argomenti vengono applicati in ordine. Puoi immaginare che una data sia convogliata da un argomento al successivo. Per esempio:
date) -> 2017-03-06-v1d) -> 2017-03-01-v-1d)-> 2017-02-28+%d%b%Y) -> 28Feb2017Puoi raggiungere qualsiasi numero di mesi in avanti o indietro utilizzando date -v-1m -v1d -v-1d, sostituendo -1mcon il numero di mesi indietro o avanti ( +1m) che desideri.
Questa è la risposta generica. Questa domanda pone domande specifiche sulle date relative a una data di inizio. L'utilità di data Mac OS / BSD non ti consente di fornire un datastamp da cui iniziare, ma puoi impostare ogni elemento data singolarmente:
date -v2015y -v1m -v15d -v1d -v-1d +%d%b%Y -> 31Dec2014
Prova a usare questo codice
date -d "-$(date +%d) days month" +%Y-%m-%d