https://www.timeanddate.com/date/weekday.html calcula vários fatos sobre um dia do ano, por exemplo:
Dada uma data arbitrária, como esses números podem ser calculados com a especificação crono C ++ 20 ?
https://www.timeanddate.com/date/weekday.html calcula vários fatos sobre um dia do ano, por exemplo:
Dada uma data arbitrária, como esses números podem ser calculados com a especificação crono C ++ 20 ?
Respostas:
Isso é notavelmente fácil com a especificação C ++ 20 chrono . Abaixo, mostro uma função que insere uma data arbitrária e imprime essas informações em
cout
. Embora no momento da redação deste artigo, a especificação do cronógrafo C ++ 20 ainda não estivesse sendo fornecida, ela é aproximada por uma biblioteca de código aberto e gratuita . Para que você possa experimentar hoje e incluí-lo em aplicativos de remessa, desde que adote o C ++ 11 ou posterior.Esta resposta assumirá a forma de uma função:
sys_days
é uma precisão do diatime_point
nasystem_clock
família. Isso significa que é simplesmente uma contagem de dias desde 1970-01-01 00:00:00 UTC. O alias de tiposys_days
é novo no C ++ 20, mas o tipo subjacente está disponível desde o C ++ 11 (time_point<system_clock, duration<int, ratio<86400>>>
). Se você usar a biblioteca de visualização C ++ 20 de código aberto ,sys_days
está emnamespace date
.O código abaixo assume a função local:
para reduzir a verbosidade. Se você estiver experimentando a biblioteca de visualização C ++ 20 de código aberto , também assuma:
Título
Para imprimir as duas primeiras linhas é simples:
Basta pegar a data
sd
e usarformat
com os familiaresstrftime
/put_time
sinalizadores para imprimir a data e o texto. A biblioteca de visualização C ++ 20 de código aberto ainda não integrou o biblioteca fmt e, portanto, usa a sequência de formatos levemente alterada"%d %B %Y is a %A\n"
.Isso produzirá (por exemplo):
Resultados intermediários comuns calculados uma vez
Esta seção da função foi escrita por último, porque ainda não se sabe quais cálculos serão necessários várias vezes. Mas depois que você souber, aqui está como calculá-los:
Precisamos dos campos de ano e mês de
sd
eweekday
(dia da semana). É eficiente calculá-los de uma vez por todas dessa maneira. Também precisaremos (várias vezes) do primeiro e do último dia do ano atual. É difícil dizer neste momento, mas é eficiente armazenar esses valores como tipo,sys_days
pois seu uso subsequente é apenas com aritmética orientada para o dia, quesys_days
é muito eficiente em (velocidades abaixo de nanossegundos).Fato 1: número do dia do ano e número de dias restantes no ano
Isso imprime o número do dia do ano, com 1º de janeiro sendo o dia 1 e, em seguida, também imprime o número de dias restantes no ano, sem incluir
sd
. O cálculo para fazer isso é trivial. Dividir cada resultado pordays{1}
é uma maneira de extrair o número de dias dentrodn
edl
em um tipo integral para fins de formatação.Fato 2: Número deste dia da semana e número total de dias da semana no ano
wd
é o dia da semana (segunda a domingo) computado na parte superior deste artigo. Para realizar esse cálculo, precisamos primeiro das datas do primeiro e do últimowd
no anoy
.y/1/wd[1]
é o primeirowd
de janeiro ey/12/wd[last]
o últimowd
de dezembro.O número total de
wd
s no ano é apenas o número de semanas entre essas duas datas (mais 1). A subexpressãolast_wd - first_wd
é o número de dias entre as duas datas. Dividir esse resultado por 1 semana resulta em um tipo integral, mantendo o número de semanas entre as duas datas.O número da semana é feito da mesma maneira que o número total de semanas, exceto um começa com o dia atual em vez do último
wd
do ano:sd - first_wd
.Fato 3: número deste dia da semana e número total de dias da semana no mês
Isso funciona exatamente como o Fato 2, exceto que começamos com o primeiro e o último
wd
s do par ano-mês emy/m
vez do ano inteiro.Fato 4: Número de dias no ano
O código praticamente fala por si.
Fato 5 Número de dias no mês
A expressão
y/m/last
é o último dia do par ano-mêsy/m
e, claro,y/m/1
é o primeiro dia do mês. Ambos são convertidos emsys_days
para que possam ser subtraídos para obter o número de dias entre eles. Adicione 1 para a contagem baseada em 1.Usar
info
pode ser usado assim:ou assim:
Aqui está o exemplo de saída:
Editar
Para aqueles que não gostam da "sintaxe convencional", existe uma "sintaxe de construtor" completa que pode ser usada.
Por exemplo:
pode ser substituído por:
fonte
std::cout << "a*b = " << a*b << "; a^b = " << a^b << '\n';
(que, felizmente, quase sempre é capturado em tempo de compilação, mas ainda é um aborrecimento). Portanto, eu seria cauteloso ao usar esse novo abuso de operador de divisão.