Formatos de entrada de data do Gnu

1

Estou tentando entender os formatos de entrada de data usados em

date -d "something"

Especificamente, estou tentando entender o uso dos "Itens do dia da semana". A página de manual para data refere-se ao seguinte conjunto de páginas GNU para obter informações sobre este tópico: gnu.org - formatos de entrada de dados .

Isso cobre todo o tópico dos formatos de entrada de data para o GNU. Especificamente, diz o seguinte sobre "Dia da semana":

28.6 Day of week items

The explicit mention of a day of the week will forward the date (only if necessary) to reach that day of the week in the future.

Days of the week may be spelled out in full: ‘Sunday’, ‘Monday’, ‘Tuesday’, ‘Wednesday’, ‘Thursday’, ‘Friday’ or ‘Saturday’. Days may be abbreviated to their first three letters, optionally followed by a period. The special abbreviations ‘Tues’ for ‘Tuesday’, ‘Wednes’ for ‘Wednesday’ and ‘Thur’ or ‘Thurs’ for ‘Thursday’ are also allowed.

A number may precede a day of the week item to move forward supplementary weeks. It is best used in expression like ‘third monday’. In this context, ‘last day’ or ‘next day’ is also acceptable; they move one week before or after the day that day by itself would represent.

A comma following a day of the week item is ignored.

Com base nessas informações, esperaria que o comando a seguir informasse a data da terceira quinta-feira de 2016.

jonathan@Aristotle:~$ date -d "4/1 3 thursday" +"%y %m %d"
16 04 01

Como você pode ver, a especificação do dia da semana é aceita, mas ignorada e o resultado é 1 de abril, não a terceira quinta-feira. A documentação declara que a especificação "dia da semana" deve ser adicionada à especificação de data base , se necessário . Infelizmente, as regras por trás de se necessário não são dadas. Alguém sabe como fazer isso funcionar usando o comando date. Obviamente, posso contornar esse problema com o script Bash.

    
por Jonathan 28.04.2016 / 17:06

2 respostas

0

Eu descobri um método que não depende da sintaxe arcana da entrada para:

date -d

Esta função resolve o problema:

function calculateTargetDay {
# Calculates the day in the month of the nth. weekday in month
# $1 is the current date stored in an array as yy mm dd integers
# $2 is the day of the week as an integer, Monday = 1
# $3 is the week of the month as an integer - first week = 1
# Returns the day of month in the $daymonth variable which should be defined in the main-line

daymonth=$(( $(date -d "${1[0]}-${1[1]}-1" +%u) - 1 )) # Get relative day in week of 1st. of month
# Calculate release day within month
daymonth=$(( $daymonth - $2 + 7 + (( $3 - 1) * 7 ) ))}  # Gives day in month of nth weekday in month

Isso encapsula o cálculo de maneira compacta.

    
por Jonathan 29.04.2016 / 16:04
0

Apenas para referência, o estilo do dia da semana é incorporado em dateutils :

$ dateconv 2016-04-03-04 -f %F
2016-04-21

que é a terceira quinta-feira de abril de 2016, conforme solicitado.

Como alternativa, a entrada pode ser explicitamente especificada:

$ dateconv -i "%m/1 %c %A" "4/1 3 thursday"
2017-04-03-04

(não sei qual é o / 1 no seu exemplo).

Disclaimer: Eu sou o autor do pacote.

    
por hroptatyr 12.05.2017 / 05:58