2013-03-25 5 views
7

मैं विशाल लॉग फ़ाइल से निकाला सप्ताह संख्या की सूची, वे सिंटैक्स का उपयोग निकाला गया है:यूनिक्स दिनांक: सप्ताह संख्या को दिनांक सीमा (सोम-सूर्य) में कैसे परिवर्तित करें?

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

मैं एक साधारण बैश समारोह जो एक तिथि सीमा में इन सप्ताह संख्या परिवर्तित कर सकते हैं बनाना चाहते हैं। मुझे लगता है कि समारोह 2 तर्कों को स्वीकार करना चाहिए: $ संख्या और $ साल, उदाहरण:

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

उत्तर

9

GNU date के साथ:

$ 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

बिल्कुल सही !! आपका बहुत बहुत धन्यवाद। – hellish

0

किसी को भी यह की जरूरत है: मैं एक भी कम जिस तरह से (यकीन नहीं करता है, तो आसान) में पाया गया :

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 } 

मैं वर्ष का पहला दिन लेता हूं और सही सप्ताह में कहीं और होने के लिए एन सप्ताह आगे जाता हूं। फिर मैं अपना सप्ताह का दिन लेता हूं और सोमवार और रविवार तक पहुंचने के लिए वापस/आगे जाता हूं।

+0

आपका 'सप्ताह का 12 2012' आउटपुट 'सोम मार्च 12 2012 - सन मार्च 18 2012'। यह 'सोम मार्च 1 9 2012 - सूर्य मार्च 25 2012' होना चाहिए। – pynexj

1

तो एक सप्ताह के शुरू होने से रविवार है, तो आप weekof के इस संस्करण का उपयोग कर सकते हैं:

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

सोमवार सप्ताह के पहले दिन, ISO week numbers है:

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 

आउटपुट:

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

यह पहले से ही 4 साल पहले उत्तर दिया गया है। आपका उत्तर क्या अतिरिक्त मूल्य लाता है? –

+0

1. यह आईएसओ सप्ताह संख्याओं को स्पष्ट रूप से 2. लक्षित करता है। यह विकिपीडिया में वर्णित एक एल्गोरिदम का उपयोग करता है 3. यह छोटा –

+0

ठीक है, पर्याप्त मेला! –

संबंधित मुद्दे