जवाबों:
एक (थोड़े बदसूरत) समाधान, BASH अंकगणितीय मूल्यांकन और 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 ))
ध्यान दें कि 0-गद्दी से %-m
रोकता date
है, इसलिए यह अभी भी अगस्त और सितंबर के लिए काम करेगा।
%m
में 09
जो बैश प्रमुख 0 के कारण अष्टक के रूप में व्याख्या करने की कोशिश करता है, इसलिए यह एक त्रुटि कहती है 09: value too great for base (error token is "09")
। इसे 0-पैडिंग को बदलकर अक्षम किया जा सकता %m
है %-m
।
मेरे खजूर का उपयोग करें :
dconv 2012-01-01 -f '%Y%Q'
=>
2012Q1
%q
और %Q
झंडे dateutils के लिए विशिष्ट हैं, और संख्या के रूप में या रूप में तिमाही वापसी Q<NUMBER>
।
dconv now -f%Y%Q | tr Q q
अगर आपको वास्तव में Q को कम आवरण वाला होना चाहिए। (पुनश्च: हम date
इसके बजाय उपसर्ग के रूप में फेडोरा में पैकेजिंग कर रहे हैं d
, इसलिए " dateconv
"।)
उदाहरण के लिए, चार चरणों में विभाजित होने वाले सभी समाधान नवंबर:
% echo $(( 11/4+1 ))
3
सही गणित होगा:
$(( (m-1)/3 +1 ))
और इस तरह, चालू और पिछले महीने की तिमाही होगी:
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
यह जाँच करने के लिए केवल बारह मान हैं, वास्तव में…
% 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
शायद, कोई प्रत्यक्ष समाधान नहीं है।
आप awk
इतने सारे बैक-टिक्स से बचने के लिए उपयोग कर सकते हैं ।
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);}'
एक perl
समाधान क्लीनर लेकिन हो सकता है perl
और DateTime
एक भारी शर्त है।
#!/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
दो बार कॉलिंग (और पासिंग पैरामीटर) से बचा जाता है ।
तारीख के साथ प्रारूप को विभाजित करें, awk के साथ गणना करें, प्रिंटफ के साथ प्रारूप:
date +"%Y %m" | awk '{printf ("%4dq%1d\n", $1, ($2/4)+1)}'
बस तारीख और बैश:
echo $(date +%Yq)$(($(date +%m)/4+1))
2012q0
जो गलत है।
एक विकल्प, एक जिज्ञासा के रूप में अधिक। यदि GNU awk
शामिल है, date
तो इसकी आवश्यकता नहीं है:
awk 'BEGIN{print strftime("%Y")"q"int((strftime("%-m")-1)/3)+1}'
date
वर्तमान वर्ष और महीने को पुनः प्राप्त करने के लिए कॉल करें, और शेष शेल में अंकगणित के साथ करें।
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
इस तिमाही के लिए मूल गणित और पिछले महीने की तिमाही:
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
स्क्रिप्ट निम्नलिखित भागों का उपयोग करती है:
अब %q
यह जानकारी दिखाने का प्रारूप है।
से coreutils-8.26 रिहाई लॉग 30 नवंबर 2016 से:
नई सुविधाएँ
...
तिथि अब वर्ष की तिमाही के उत्पादन के लिए% q प्रारूप को स्वीकार करती है।
और हाँ यह काम करता है!
$ date "+%q"
4
$ date "+%Yq%q"
2016q4
यदि आप चाहते हैं कि वित्तीय 13-सप्ताह की तिमाही जो कि आईएसओ सप्ताह कैलेंडर पर आधारित है, तो नया काम% q दुख की बात नहीं है। यहाँ awk / strftime के साथ @ manatwork के डेटालेस समाधान का एक संस्करण है।
awk 'BEGIN{$x=int((strftime("%V")-1)/13)+1;print strftime("%G")"q"($x>4?4:$x)}'
अंतिम छोटी टर्नरी बिट आईएसओ लीप-सप्ताह के वर्षों को संभालती है जहां अंतिम तिमाही में 14 सप्ताह होते हैं।