Server Fault is a question and answer site for system and network administrators. It's 100% free, no registration required.

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

On the Linux CLI, is there a way to get the number of the week of the month? Maybe there is another way to get this with one simple (like date) command? Let's say that day 1 to 7 is the first week, day 8 to 14 is the second week, and so on.

share|improve this question
How do you define the week of the month? The day number divided by 7 and rounded down? Number of Sundays/Mondays/whatever which have passed? – mgorven Apr 27 '12 at 5:23
lets say from one to 7 day its 1rst week, from 7 to 14 second week, from 14 to 21 third and from 21 to end of the month its fourth week. I know that simple bash script with date nad if is nice solution for this but im wondering if i can di that with one command without doing a script. – B14D3 Apr 27 '12 at 5:28
@B14D3 your "week of month" definition is pretty coarse -- what specifically are you using this for? – voretaq7 Apr 27 '12 at 5:47
For nothing I was reading man for date and that came to my mind (Sometimes I have so silly thoughts). So what will be a better definition ? – B14D3 Apr 27 '12 at 5:54
up vote 13 down vote accepted

The date command can't do this internally, so you need some external arithmetic.

echo $((($(date +%-d)-1)/7+1))

Edit: Added a minus sign between the % and the d

share|improve this answer
That work fine, but I dont understand why this arithmetic returns integer ? – B14D3 Apr 27 '12 at 5:50
Bash only does integer arithmetic. – mgorven Apr 27 '12 at 5:52
Wow didn't know that. Thx :D – B14D3 Apr 27 '12 at 5:56
That's correct -- days 29+ are in the 5th week of the month. – mgorven Apr 27 '12 at 6:06
Sorry I dont know how to format the comment to look nicer. Anyway, great idea to implement, however if the date is 08 or 09, it will cause error: -bash: (09: value too great for base (error token is "09"). Thats is because if numerical value starts with 0, it will be intepreted as octal number by C language, so 08 09 are invalid. For me, the workaround is to change from %d to %e, %e omits the leading 0: echo $((($(date +%e)-1)/7+1)) – Shâu Shắc Sep 9 '13 at 3:55

Try this:

d=`date +%d` ; m=`date +%m` ; y=`date +%Y` ; cal $m $y | sed -n "3,$ p" | sed -n "/$d/{=;q;}"
share|improve this answer
doesn't look simple for me :D and for today it gives me 5 – B14D3 Apr 27 '12 at 5:43

You can use this:

Monday First week day

WEEKNUMBER=$(( 1 + $(date +%V) - $(date -d "$(date -d "-$(($(date +%d)-1)) days")" +%V) ))

Sunday Firs week daty

WEEKNUMBER=$(( 1 + $(date +%U) - $(date -d "$(date -d "-$(($(date +%d)-1)) days")" +%U) ))
share|improve this answer

If you accept external tools in your quest, try dateutils. It's got the notion of occurrence-within-month dates, i.e. 27 Apr 2012 is the 4th Fri in Apr 2012, which just coincides with your week definition. To get that number use:

dconv 2012-04-27 -f %c

%c (count) is the format specifier for the occurrence-within the month. Or to be even cooler try

dconv today -f '%cth %a in %b %Y'
  1st Wed in Sep 2012
share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.