Komut satırından bir yıl çeyrek tarih nasıl oluşturulur?


10

Bir önceki ayın yıl çeyreğinin yanı sıra mevcut yılın çeyreğinin temsilini çıkarmakla ilgileniyorum.

Bugün 1 Ocak 2012 ise, almak istiyorum

2012q1

ve

2011q4

ilgili çıkışlar olarak.

Yanıtlar:


10

BASH aritmetik değerlendirmesi ve GNU datekomutu kullanan bir (biraz çirkin) çözüm :

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

O Not %-mönler date0-dolgu dan, bu yüzden hala Ağustos ve Eylül için çalışacaktır.


2
Kullanımdan kaldırılan ters çentikler yerine $ (...) alın. Kolayca iç içe geçebilirler.
kullanıcı bilinmiyor

1
sadece merak edin: diğer cevaplar neden 4'ü bölen olarak kullanıyor?
LiuYan 刘 研

2
@LiuYan 刘 研: Emin değilim. Çeyrekte 3 ay var, bu yüzden bence 3 doğru bölen. (Yine de bu beni ilk başta
şaşırttı

Eylül ayında hangi bash önde 0 nedeniyle sekizlik olarak yorumlamaya çalışır %mverir 09, bu yüzden bu bir hata atar 09: value too great for base (error token is "09"). Bu değiştirerek 0-dolgu devre dışı bırakarak sabitlenebilir %miçin %-m.
Matthew

5

Dateutils'imi kullan :

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

%qVe %Qbayraklar dateutils özeldir ve sayı olarak veya formda çeyrek dönüş Q<NUMBER>.


dconv now -f%Y%Q | tr Q qgerçekten Q'nun daha düşük kasalı olması gerekiyorsa. (PS: Fedora'da bunu " " dateyerine önek olarak ddateconv
paketliyoruz

5

Dörde bölünen tüm çözümler başarısız olur, örneğin Kasım:

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

Doğru matematik:

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

Ve şimdiki ve önceki ayın çeyreği şöyle olurdu:

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

Kontrol etmek için sadece on iki değer var…

% 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

1
+1 "için için bölen tüm çözümler başarısız" için. Haklısın! Çeyrek 3 ay
Stephen Quan

4

Muhtemelen, doğrudan bir çözüm yoktur.

Bu awkkadar çok keneyi önlemek için kullanabilirsiniz .

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);}'

Bir perlçözüm temizleyici ama olacağını perlve DateTimebir ağır önkoşuldur.

#!/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"

Güzel. Ben ilk tarih / awk satırını seviyorum, çünkü dateiki kez çağırmaktan (ve parametreleri iletmekten) kaçınır .
smokris

4

Formatı tarihle bölün, awk ile hesaplayın, printf ile formatlayın:

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

Sadece tarih ve bash:

echo $(date +%Yq)$(($(date +%m)/4+1))

İlk satır 2012q0yanlış çıktı.
smokris

@smokris: Haklısın - Testlerimin yanlış sırasını seçtim.
kullanıcı bilinmiyor

4

Bir alternatif, daha çok bir merak olarak. GNU awksöz konusu ise date, gerekli değildir:

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

3

dateCari yıl ve ay almak için geri kalanını çağırın ve gerisini kabukta aritmetik ile yapın.

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

2

Bu ay için Yıl Çeyrek

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

Dün-ay için Yıl-Çeyrek

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

2

Bu çeyrek ve geçen ayın çeyreği için temel matematik:

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

Komut dosyası aşağıdaki bölümleri kullanır:

  1. $ (unix-cmd) - kabuk betiğindeki bir komutu değerlendirir
  2. $ ((ifade)) - matematiksel bir ifadeyi değerlendirir
  3. yeniden eşleme 1..12 -> 1..4 aşağıdaki matematiği kullanır (m-1) / 3 + 1
  4. önceki ayın değerlendirilmesi modulo matematiğini kullanır

2

Artık %qbu bilgileri gösterme biçimi var.

Gönderen coreutils-8.26 sürüm günlüğüne 30 Kasım 2016 den:

Yeni Özellikler
...
tarih artık yılın çeyreğini çıkarmak için% q biçimini kabul ediyor.

Ve evet işe yarıyor!

$ date "+%q"
4
$ date "+%Yq%q"
2016q4

0

ISO haftası takvimini temel alan 13 haftalık mali üç aylık dönemi istiyorsanız, yeni kullanışlı% q ne yazık ki işe yaramayacak. İşte @ manatwork'ün awk / strftime ile dateless çözümünün bir versiyonu.

awk 'BEGIN{$x=int((strftime("%V")-1)/13)+1;print strftime("%G")"q"($x>4?4:$x)}'

Son küçük üçlü bit, son çeyreğin 14 hafta olduğu ISO artık haftalarını ele alıyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.