Como obtenho a data de término do mês anterior, com base na data de processamento?
Exemplos:
- Data de processamento = 15jan2015
- Data prevista = 31dec2014,
- Data de processamento = 10feb2015
- Data prevista = 31jan2015
Como obtenho a data de término do mês anterior, com base na data de processamento?
Exemplos:
Respostas:
Com o GNU date
:
$ date +%d%b%Y
16Aug2015
$ date -d "$(date +%Y-%m-01) -1 day" +%d%b%Y
31Jul2015
Alguns shells possuem suporte interno para manipulação de datas:
Com ksh93
:
$ printf "%(%d%b%Y)T\n" "1st day, yesterday"
31Jul2015
Com 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
Existem várias maneiras de fazer isso; Aqui está o mais simples que encontrei (assumindo o 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'
. Você recebe um erro porque não havia 2011-12-30 lá. Ou seja, o deslocamento do dia foi feito no horário do calendário. 2011-12-31 menos 31 dias fornece 30/11/2011 porque tira 31 de 31. Não leva 31 * 24 * 60 * 60 * 60 segundos do horário atual. Compare com o TZ=Pacific/Apia faketime '2011-12-31 12:00' date -d '24 hour ago'
que lhe dá o dia 29, ou seja, desta vez, a data em que ocorreu 24 * 60 * 60 * 60 segundos atrás.
Aqui está uma versão que funciona no Mac OS, que usa o date
utilitário BSD :
date -v1d -v-1d +%d%b%Y
Os argumentos são aplicados em ordem. Você pode imaginar que uma data é canalizada de um argumento para o outro. Por exemplo:
date
) -> 06/03/2017-v1d
) -> 01/03/2017-v-1d)
-> 28-02-2017+%d%b%Y
) -> 28Fev2017Você pode atingir qualquer número de meses para frente ou para trás usando date -v-1m -v1d -v-1d
, substituindo -1m
pelo número de meses para trás ou para frente ( +1m
) desejado.
Essa é a resposta genérica. Esta pergunta pergunta especificamente sobre datas relativas a uma data de início. O utilitário de data do Mac OS / BSD não permite que você forneça um carimbo de data para começar, mas é possível definir cada elemento de data individualmente:
date -v2015y -v1m -v15d -v1d -v-1d +%d%b%Y
-> 31 de dezembro de 2014
Tente usar este código
date -d "-$(date +%d) days month" +%Y-%m-%d