Obtenha a data do último dia do último mês em um shell script

9

Como faço para obter a data de término do mês anterior, com base na data de processamento?

Exemplos:

  • Data de processamento = 15jan2015
  • Data prevista = 31 de dezembro de2014
  • Data de processamento = 10 de fevereiro de 2015
  • Data esperada = 31jan2015
por user128856 16.08.2015 / 20:23

4 respostas

24

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 data:

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
    
por 16.08.2015 / 20:29
4

Existem muitas maneiras de fazer isso ; aqui é o mais simples I found (aqui assumindo o GNU date ):

$ date -d "-$(date +%d) days"
Fri Jul 31 16:07:23 EDT 2015
    
por 16.08.2015 / 21:36
2

Aqui está uma versão que funciona no Mac OS, que usa o utilitário BSD date :

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:

  • Comece com a data atual ( date ) - > 2017-03-06
  • Defina essa data para o primeiro dia do mês ( -v1d ) - > 2017-03-01
  • Subtrair um dia disso ( -v-1d) - > 2017-02-28
  • Formate a data ( +%d%b%Y ) - > 28 de fevereiro de 2017

Você pode alcançar 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 anteriores ou futuros ( +1m ) desejados.

Essa é a resposta genérica. Esta questão pergunta especificamente sobre datas relativas a uma data inicial. O utilitário de data do Mac OS / BSD não permite que você forneça um datestamp para iniciar, mas você pode definir cada elemento de data individualmente:

date -v2015y -v1m -v15d -v1d -v-1d +%d%b%Y - > 31dec2014

    
por 06.03.2017 / 19:27
-1

Tente usar este código

date -d "-$(date +%d) days  month" +%Y-%m-%d
    
por 04.03.2017 / 11:49