উত্তর:
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
যা ভুল।
একটি বিকল্প, আরও কৌতূহল হিসাবে। যদি জিএনইউ 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 থেকে:
নতুন বৈশিষ্ট্য
...
তারিখটি এখন বছরের কোয়ার্টারে আউটপুট করতে% কিউ ফর্ম্যাটটি গ্রহণ করে।
এবং হ্যাঁ এটি কাজ করে!
$ date "+%q"
4
$ date "+%Yq%q"
2016q4
আপনি যদি চান রাজস্ব 13 সপ্তাহ কোয়ার্টার যে আইএসও সপ্তাহে ক্যালেন্ডার উপর ভিত্তি করে এর, তারপরে নতুন কুশলী% কুই কাজ দুঃখিতভাবে যাচ্ছে না। অ্যাডাব্লু / স্ট্রফটাইম সহ @ মান্যাটওয়ার্কের অবিরাম সমাধানের একটি সংস্করণ এখানে।
awk 'BEGIN{$x=int((strftime("%V")-1)/13)+1;print strftime("%G")"q"($x>4?4:$x)}'
সর্বশেষ সামান্য ত্রৈমাসিক বিট আইএসও লিপ-সপ্তাহের বছরগুলি পরিচালনা করে যেখানে শেষ প্রান্তিকে 14 সপ্তাহ রয়েছে।