2013-03-25 13 views
7

Ben büyük günlük dosyasından çıkarılan hafta numaralarının listesi, bunlar sözdizimi kullanılarak çıkarıldı vardır:UNIX tarihi: Hafta sayısını bir tarih aralığına (Mon-Sun) nasıl dönüştürebilirim?

$ date --date="Wed Mar 20 10:19:56 2012" +%W; 
12 

Bir tarih aralığı için bu hafta numaraları dönüştürebilirsiniz basit bir bash fonksiyonunu oluşturmak istiyorum. $ Numarası ve $ yıl, örnek:

$ week() { ......... } 
$ number=12; year=2012 
$ week $number $year 
"Mon Mar 19 2012" - "Sun Mar 25 2012" 

cevap

9

GNU date olarak:

$ cat weekof.sh 
function weekof() 
{ 
    local week=$1 year=$2 
    local week_num_of_Jan_1 week_day_of_Jan_1 
    local first_Mon 
    local date_fmt="+%a %b %d %Y" 
    local mon sun 

    week_num_of_Jan_1=$(date -d $year-01-01 +%W) 
    week_day_of_Jan_1=$(date -d $year-01-01 +%u) 

    if ((week_num_of_Jan_1)); then 
     first_Mon=$year-01-01 
    else 
     first_Mon=$year-01-$((01 + (7 - week_day_of_Jan_1 + 1))) 
    fi 

    mon=$(date -d "$first_Mon +$((week - 1)) week" "$date_fmt") 
    sun=$(date -d "$first_Mon +$((week - 1)) week + 6 day" "$date_fmt") 
    echo "\"$mon\" - \"$sun\"" 
} 

weekof $1 $2 
$ bash weekof.sh 12 2012 
"Mon Mar 19 2012" - "Sun Mar 25 2012" 
$ bash weekof.sh 1 2018 
"Mon Jan 01 2018" - "Sun Jan 07 2018" 
$ 
+0

Mükemmel !! çok teşekkür ederim. – hellish

0

herhangi birinin bu ihtiyacı varsa: Ben fonksiyonu 2 bağımsız değişken kabul etmelidir varsayalım ben daha kısa bir yol (daha kolay emin değilim) bulundu :

function weekof() { 
     local year=$2 
     local week=`echo $1 | sed 's/^0*//'` # Fixes random bug 
     local dateFormat="+%a %b %d %Y" 
     # Offset is the day of week, so we can calculate back to monday 
     local offset="`date -d "$year/01/01 +$((week - 1)) week" "+%u"`" 
     echo -n "`date -d "$year/01/01 +$((week - 1)) week +$((1 - $offset)) day" "$dateFormat"`" # Monday 
     echo -n " - " 
     echo "`date -d "$year/01/01 +$((week - 1)) week +$((7 - $offset)) day" "$dateFormat"`" # Sunday } 

Yılın ilk gününü alıyorum ve doğru haftada bir yerde olmak için haftalarca ileri gidiyorum. Daha sonra hafta içi günümü alıp pazara ve pazara ulaşmak için geri dönüyorum.

+0

"weekof 12 2012" ürününüz "Mon Mar 12 2012 - Sun Mar 18 2012". “Mon Mar 19 2012 - Sun Mar 25 2012” olmalıdır. – pynexj

1

haftanın ilk Pazar ise, weekof bu sürümünü kullanabilirsiniz:

function weekof() 
{ 
    local week=$1 year=$2 
    local week_num_of_Jan_1 week_day_of_Jan_1 
    local first_Sun 
    local date_fmt="+%Y-%m-%d" 
    local sun sat 

    week_num_of_Jan_1=$(date -d $year-01-01 +%U) 
    week_day_of_Jan_1=$(date -d $year-01-01 +%u) 

    if ((week_num_of_Jan_1)); then 
     first_Sun=$year-01-01 
    else 
     first_Sun=$year-01-$((01 + (7 - week_day_of_Jan_1))) 
    fi 

    sun=$(date -d "$first_Sun +$((week - 1)) week" "$date_fmt") 
    sat=$(date -d "$first_Sun +$((week - 1)) week + 6 day" "$date_fmt") 
    echo "$sun $sat" 
} 
1

Pazartesi, ISO week numbers haftanın ilk günüdür:

function week2date() { 
    local year=$1 
    local week=$2 
    local dayofweek=$3 
    date -d "$year-01-01 +$(($week * 7 + 1 - $(date -d "$year-01-04" +%w) - 3)) days -2 days + $dayofweek days" +"%Y-%m-%d" 
} 

week2date 2017 35 1 
week2date 2017 35 7 

Çıktı:

2017-08-28 
2017-09-03 
+0

Bu daha önce 4 yıl önce yanıtlandı. Cevabınız ne katma değer getirir? –

+0

1. Açıkça ISO hafta sayılarını hedefler 2. Bu, Wikipedia 3'te açıklanan bir algoritma kullanır. Daha kısadır –

+0

Pekala, yeterince iyi! –