Como obter o último dia do mês anterior no UNIX (HPUX)

4

Estou criando um script que coleta informações do mês anterior usado para relatórios:

Até agora eu tenho as seguintes variáveis:

#I used an array to get the previous month. 
set -A months Dec Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov
x='date +%m'  
y='expr $x - 1'
year='date +%Y'
month='perl -MPOSIX=strftime -le '@t = localtime; $t[3] = 1; $t[4]--;print strftime("%m", @t)''
month_abv='echo ${months[$y]}'

Saída variável:

year=2017
month=04
month_abv=Apr

Tudo o que preciso agora é o último dia do mês anterior.

    
por Christopher Karsten 09.05.2017 / 08:30

5 respostas

2

A maneira como fui fazer o último dia do mês anterior é:

cal $month $year | awk 'NF {DAYS = $NF}; END {print DAYS}'

Usando os marcadores possíveis, posso obter os meses anteriores e imprimir o último dia do mês:

cal 04 2017 | awk 'NF {DAYS = $NF}; END {print DAYS}'

Saída:

30

Se houver uma maneira mais fácil ou mais curta, por favor, estou aberto a todas as sugestões.

    
por 09.05.2017 / 08:30
4

Você pode calcular um dia antes do primeiro dia deste mês, usando o GNU date :

date -d "$(date +"%Y-%m-01") - 1 day" +"%F"

ou usando dateutils ' dateadd :

dateadd "$(date +"%Y-%m-01")" "-1d"

ou um pouco complicado dateutils usage. Arredondar para o último 31º dia do mês. (Comportamento documentado que funciona mesmo durante meses com menos de 31 dias.)

$ dateround --next today -31d
2017-04-30
$ dateround --next "2016-03-10" -31d
2016-02-29
    
por 09.05.2017 / 10:09
2

Tente:

eval "$(
  LC_ALL=C perl -MPOSIX -le '
    @t = localtime;
    $t[3]=0; # set day to 0 (day before the first)
    print strftime q(year=%Y month=%m day=%d month_abv="%b"), @t'
)"

perl constrói algum código de shell (como year=2017 month=04 day=30 month_abv="Apr" ) que nós então eval uate no shell atual (assumindo um shell POSIX).

LC_ALL=C é forçar o month_abv a estar em inglês, independentemente da localidade. Remova-o se preferir que esteja na localidade do usuário.

Esse truque day=0 funciona com strftime() do GNU, FreeBSD e Solaris, mas não sei como é portável fora disso.

Para obter o primeiro dia do mês anterior, substitua $t[3]=0 por $t[3]=1; $t[4]-- , o que, para mim, funciona mesmo em janeiro, mas, novamente, não sei ao certo como é portátil .

    
por 09.05.2017 / 11:00
2

O abaixo parece funcionar bem para mim em ksh88 (graças a Stéphane Chazelas por alguma ajuda com isso)

#! /bin/ksh
eval "$(date +'y=%Y m=%m')"
echo "Current month = $m"
echo "Current year = $y"

#get previous month (and year of previous month)
if [[ $((m-1)) -gt 0 ]]
then
    p_m=$((m-1))
    p_m_y=$((y))
else
    p_m=12
    p_m_y=$((y-1))
fi
echo "p_m = $p_m"
echo "p_m_y = $p_m_y"

#get first/last day of previous month
p_m_from=01.${p_m}.${p_m_y}
p_m_to=$(cal $p_m $p_m_Y | grep -v ^$ | tail -1 | sed 's/^.* \([0-9]*\)$//').${p_m}.${p_m_y}
echo "Previous month runs from $p_m_from to $p_m_to"
    
por 09.05.2017 / 17:31
0

Para encontrar o mês anterior, siga este:

date -d "-1 months" +%Y/%-m/%-d

Isso lhe dará: 2018/2/22 enquanto é 2018/3/22 .

date -d "-1 days" +%Y/%-m/%-d

Irá dar-lhe: 2018/3/21

Você pode adicionar ou subtrair quantos meses ou dias quiser. Se você subtrair meses suficientes, irá para o ano passado.

    
por 22.03.2018 / 16:18

Tags