Convertendo inteiro para o dia da semana usando data (1)

1

Usando date , posso converter dias de semanas em números inteiros de 1 a 7, por exemplo:

$ date -d "Thursday" +%u
4

Mas e se eu quiser executar a operação inversa? Algo como,

$ date [options] [+format]
Thursday

Tudo bem se não for possível com a data, também posso usar outros programas. Visando a brevidade aqui.

    
por Berk Özbalcı 17.02.2017 / 13:30

3 respostas

5

Você pode obter a data do próximo domingo, adicionar N dias e imprimir o nome do dia para essa data específica:

getdayname () {
nextplus=$(date -d "next Sunday +$1 days")
date -d "${nextplus}" '+%A'
}

e execute getdayname 2 , getdayname 7 etc (assumindo gnu date ).
Ou simplesmente use uma matriz e não use o date , por exemplo,

getdayname () {
local days=( Sunday Monday Tuesday Wednesday Thursday Friday Saturday )
printf %s\n ${days[$1]}
}

embora com bash / ksh você precisa de printf %s\n "${days[$1-1]}" (quando a indexação começa em 0 ) , e aspas são necessárias para evitar split + glob (também com yash ).

    
por 17.02.2017 / 13:59
1

Com base na resposta de don_crissti, já que sua primeira resposta me dá resultados incorretos:

getdayname() {
        date -d "$(( 7-$(date '+%u')+$1 )) days" '+%A'
}
    
por 28.11.2017 / 11:52
1

POSIXly ( -d não é uma opção padrão date . Quando disponível, significa algo diferente para diferentes implementações), para fornecer o nome do dia na localidade do usuário, sendo o domingo 0 ou 7:

getdayname() (
  IFS=';'
  set -o noglob
  days=$(locale day) || exit
  for day do
    set -- $days $days
    shift "$day" &&
      printf '%s\n' "$1"
  done
)

Exemplos:

$ getdayname 0 4 7
Sunday
Thursday
Sunday
$ LANG=es_VE.UTF-8 getdayname 0 4 7
domingo
jueves
domingo

Com GNU ou busybox date (cujo -d ... não suporta datas relativas), ou ast-open date (cujo -d ... suporta datas relativas mas de uma maneira diferente do date do GNU):

getdayname() (
  for day do
    date -ud "1970-01-$((day + 11))" +%A
  done
)

Com zsh sem requisitos externos:

$ zmodload zsh/langinfo
$ day=0
$ printf '%s\n' $langinfo[DAY_$((day+1))]
Sunday

Ou:

$ zmodload zsh/datetime
$ day=0
$ TZ=UTC0 strftime %A $((86400 * (3+day)))
Sunday
    
por 28.11.2017 / 12:44

Tags