Como gerar uma data de trimestre de ano a partir da linha de comando?

7

Estou interessado em mostrar uma representação do trimestre do ano atual, assim como o trimestre do ano anterior.

Se hoje for 1º de janeiro de 2012, gostaria de obter

2012q1

e

2011q4

como as respectivas saídas.

    
por smokris 14.02.2012 / 22:28

10 respostas

9

Uma solução (meio feia), usando a avaliação aritmética BASH e o comando GNU date :

echo $(date +%Y)q$(( ($(date +%-m)-1)/3+1 ))
echo $(date -d "-1 month" +%Y)q$(( ($(date -d "-1 month" +%-m)-1)/3+1 ))

Observe que %-m evita date do preenchimento 0, então isso ainda funcionará para agosto e setembro.

    
por 14.02.2012 / 22:31
5

Use meus dateutils :

dconv 2012-01-01 -f '%Y%Q'
=>
  2012Q1

Os sinalizadores %q e %Q são específicos para dateutils e retornam o quarto como número ou no formato Q<NUMBER> .

    
por 13.04.2012 / 16:43
5

Todas as soluções que dividem por quatro falham, por exemplo novembro:

% echo $(( 11/4+1 ))
3

A matemática correta seria:

$(( (m-1)/3 +1 ))

E, como tal, o trimestre do mês atual e do mês anterior seria:

echo curr ${y}q$(((m-1)/3+1))
if [ $m = 1 ]; then
  echo prev $((y-1))q4
else
  echo prev ${y}q$(((m-2)/3+1))
fi

São apenas doze valores para verificar, realmente…

% for m in {1..12}; do echo $m Q$(((m-1)/3+1)); done
1 Q1
2 Q1
3 Q1
4 Q2
5 Q2
6 Q2
7 Q3
8 Q3
9 Q3
10 Q4
11 Q4
12 Q4
    
por 29.04.2013 / 13:45
4

Provavelmente, não há solução direta.

Você pode usar awk para evitar tantos retrocessos.

date +"%Y %m" | awk '{q=int($2/4)+1; printf("%sq%s\n", $1, q);}'
date +"%Y %m" | awk '{q=int($2/4);y=$1;if (q==0){q=4;y=y-1;}; printf("%sq%s\n", y, q);}'

Uma solução perl seria mais limpa, mas perl e DateTime são um pré-requisito pesado.

#!/usr/bin/perl

use DateTime;

my $today = DateTime->now;
print "today: " . $today->year . "q" . $today->quarter . "\n";

my $ago = DateTime->now->subtract( months=> 4);
print "some time ago: " . $ago->year . "q" . $ago->quarter . "\n"
    
por 15.02.2012 / 00:53
4

Divida o formato com data, calcule com awk, formate com printf:

date +"%Y %m" | awk '{printf ("%4dq%1d\n", $1, ($2/4)+1)}'

Apenas date e bash:

echo $(date +%Yq)$(($(date +%m)/4+1))
    
por 15.02.2012 / 01:20
4

Uma alternativa, mais como curiosidade. Se o awk do GNU estiver envolvido, date não é necessário:

awk 'BEGIN{print strftime("%Y")"q"int((strftime("%-m")-1)/3)+1}'
    
por 15.02.2012 / 10:47
3

Chame date para recuperar o ano e o mês atuais e faça o resto com aritmética no shell.

set $(date '+%Y %m');
this_quarter=${1}q$(($2 / 4 + 1))
if [ $2 -eq 1 ]; then
  last_month_quarter=$(($1 - 1))q4
else
  last_month_quarter=${1}q$((($2 - 1) / 4 + 1))
fi
    
por 15.02.2012 / 07:53
2

Primeiro trimestre deste mês

date +"%Yq$(expr $(expr $(date +%m) - 1) / 3 + 1)"

Trimestre do ano para o mês do mês anterior

date +"%Yq$(expr $(expr $(date -d '-1 month' +%m) - 1) / 3 + 1)"
    
por 10.09.2014 / 20:09
2

Matemática básica para este trimestre e trimestre do mês passado:

y1=$(date +%Y)
m1=$(date +%m)
q1=$(( (m1 - 1) / 3 + 1))
y2=$(( y1 - (m1 == 1) ))
m2=$(( (m1 + 10) % 12 + 1 ))
q2=$(( (m2 - 1) / 3 + 1 ))
echo This Quarter: $((y1))q$q1
echo Last Month Quarter: $((y2))q$q2

O script usa as seguintes partes:

  1. $ (unix-cmd) - avalia um comando no script de shell
  2. $ ((expr)) - avalia uma expressão matemática
  3. remapeamento 1.12 - > 1..4 usa a seguinte matemática (m-1) / 3 + 1
  4. avaliando o mês anterior usa módulo de matemática
por 15.02.2012 / 12:09
0

Existe agora o formato %q para mostrar esta informação.

No log de lançamento do coreutils-8.26 de 30 de novembro de 2016:

New Features
...
date now accepts the %q format to output the quarter of the year.

E sim, funciona!

$ date "+%q"
4
$ date "+%Yq%q"
2016q4
    
por 02.12.2016 / 11:37