Réponses:
Une solution (un peu moche), utilisant l'évaluation arithmétique BASH et la date
commande GNU :
echo $(date +%Y)q$(( ($(date +%-m)-1)/3+1 ))
echo $(date -d "-1 month" +%Y)q$(( ($(date -d "-1 month" +%-m)-1)/3+1 ))
Notez que le %-m
empêche date
de remplissage 0, donc cela fonctionnera toujours pour août et septembre.
%m
donne 09
qui tente bash d'interpréter comme octal en raison de le 0, donc cela jette une erreur qui dit 09: value too great for base (error token is "09")
. Cela peut être résolu en désactivant le remplissage 0 en passant %m
à %-m
.
Utilisez mes dateutils :
dconv 2012-01-01 -f '%Y%Q'
=>
2012Q1
Les drapeaux %q
et %Q
sont spécifiques aux dateutils et renvoient le trimestre sous forme de nombre ou dans le formulaire Q<NUMBER>
.
dconv now -f%Y%Q | tr Q q
si vous avez vraiment besoin que ce Q soit inférieur. (PS: nous emballons ceci dans Fedora avec date
comme préfixe au lieu de d
, donc " dateconv
".)
Toutes les solutions divisées par quatre échouent, par exemple en novembre:
% echo $(( 11/4+1 ))
3
Le calcul correct serait:
$(( (m-1)/3 +1 ))
Et en tant que tel, le trimestre du mois en cours et du mois précédent serait:
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
Ce n'est que douze valeurs à vérifier, vraiment ...
% 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
Il n'y a probablement pas de solution directe.
Vous pouvez utiliser awk
pour éviter autant de tiques en arrière.
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);}'
Une perl
solution serait plus propre mais perl
et DateTime
sont une condition sine qua non lourd.
#!/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"
date
deux fois.
Divisez le format avec la date, calculez avec awk, formatez avec printf:
date +"%Y %m" | awk '{printf ("%4dq%1d\n", $1, ($2/4)+1)}'
Juste date et bash:
echo $(date +%Yq)$(($(date +%m)/4+1))
2012q0
ce qui est incorrect.
Une alternative, plus comme curiosité. Si GNU awk
est impliqué, date
n'est pas nécessaire:
awk 'BEGIN{print strftime("%Y")"q"int((strftime("%-m")-1)/3)+1}'
Appelez date
pour récupérer l'année et le mois en cours et faites le reste avec l'arithmétique dans la coquille.
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
Mathématiques de base pour ce trimestre et le trimestre du mois dernier:
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
Le script utilise les parties suivantes:
Il y a maintenant le %q
format pour afficher ces informations.
Depuis le journal des versions de coreutils-8.26 du 30 novembre 2016:
Nouvelles fonctionnalités
...
date accepte désormais le format% q pour afficher le trimestre de l'année.
Et oui ça marche!
$ date "+%q"
4
$ date "+%Yq%q"
2016q4
Si vous voulez le trimestre fiscal de 13 semaines basé sur le calendrier hebdomadaire ISO, le nouveau% q pratique ne fonctionnera malheureusement pas. Voici une version de la solution sans date de @ manatwork avec awk / strftime.
awk 'BEGIN{$x=int((strftime("%V")-1)/13)+1;print strftime("%G")"q"($x>4?4:$x)}'
Le dernier petit morceau ternaire gère les années ISO de semaine bissextile où le dernier trimestre a 14 semaines.