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' date
utilità 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 -1m
con 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