Como determinar o número da semana do mês


10

Na CLI do Linux, existe uma maneira de obter o número da semana do mês? Talvez haja outra maneira de conseguir isso com um datecomando simples (como )? Digamos que o dia 1 ao 7 seja a primeira semana, o dia 8 ao 14 seja a segunda semana e assim por diante.


Como você define a semana do mês? O número do dia dividido por 7 e arredondado para baixo? Número de domingos / segundas-feiras / o que quer que tenha passado?
mgorven

digamos de um a sete dias na sua primeira semana, de sete a 14 na segunda semana, de 14 a 21 na terceira e de 21 ao final do mês em sua quarta semana. Eu sei que script bash simples com data nad se é uma boa solução para isso, mas eu estou querendo saber se eu posso di isso com um comando sem fazer um script.
B14D3

@ B14D3 sua definição de "semana do mês" é bastante grossa - para que você está usando isso especificamente?
precisa saber é o seguinte

1
Por nada, eu estava lendo um homem para namorar e isso me veio à mente (às vezes tenho pensamentos tão bobos). Então, qual será uma definição melhor?
B14D3

Respostas:


21

O datecomando não pode fazer isso internamente, então você precisa de alguma aritmética externa.

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

Editar: adicionado um sinal de menos entre os% ed


Isso funciona bem, mas não entendo por que essa aritmética retorna inteiro?
B14D3

2
O Bash apenas aritmético inteiro.
mgorven

Uau não sabia disso. Thx: D
B14D3

4
Está correto - os dias 29 ou mais estão na 5ª semana do mês.
mgorven

5
Desculpe, eu não sei como formatar o comentário para parecer melhor. Enfim, ótima idéia para implementar, no entanto, se a data for 08 ou 09, isso causará erro: -bash: (09: valor muito alto para a base (o token de erro é "09"). Isso ocorre porque se o valor numérico começar com 0 , ele será interpretado como número octal pelo idioma C, portanto, 08 09 é inválido. Para mim, a solução alternativa é mudar de% d para% e,% e omite o 0: echo $ inicial (((($ (date +% e) -1) / 7 + 1))
Shâu Shắc

2

Você pode usar isto:

Segunda-feira Primeiro dia da semana

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

Domingo Firs semana daty

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

1

Tente o seguinte:

d=`date +%d` ; m=`date +%m` ; y=`date +%Y` ; cal $m $y | sed -n "3,$ p" | sed -n "/$d/{=;q;}"

não parece simples para mim: D e para hoje dá-me 5
B14D3

1

simplificando a solução de Victor Sanchez:

expr 1 + $(date +%V) - $(date +%V -d $(date +%Y-%m-01))

substitua% V por% U se desejar semanas a partir de domingo.

btw: teve que usar expr em vez de $ ((...)) porque o último não parece gostar de números com zeros à esquerda.


0

Se você aceitar ferramentas externas em sua busca, tente o dateutils . Ele tem a noção de datas de ocorrência dentro do mês, ou seja, 27 de abril de 2012 é o 4º sex de abril de 2012, que apenas coincide com a definição da sua semana. Para obter esse número, use:

dconv 2012-04-27 -f %c
=>
  04

%c(contagem) é o especificador de formato para a ocorrência - dentro do mês. Ou, para ser ainda mais legal, tente

dconv today -f '%cth %a in %b %Y'
=>
  1st Wed in Sep 2012
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.