https://www.timeanddate.com/date/weekday.html calcula varios datos sobre un día del año, por ejemplo:
Dada una fecha arbitraria, ¿cómo se pueden calcular estos números con la especificación cronológica C ++ 20 ?
https://www.timeanddate.com/date/weekday.html calcula varios datos sobre un día del año, por ejemplo:
Dada una fecha arbitraria, ¿cómo se pueden calcular estos números con la especificación cronológica C ++ 20 ?
Respuestas:
Esto es notablemente fácil con la especificación cronológica C ++ 20 . A continuación muestro una función que ingresa una fecha arbitraria e imprime esta información
cout. Aunque en el momento de escribir este artículo, la especificación cronológica C ++ 20 aún no se envía, se aproxima a una biblioteca gratuita de código abierto . Por lo tanto, puede experimentar con él hoy e incluso incluirlo en las aplicaciones de envío siempre que adopte C ++ 11 o posterior.Esta respuesta tomará la forma de una función:
sys_daysEs un día de precisióntime_pointen lasystem_clockfamilia. Eso significa que es simplemente un recuento de días desde 1970-01-01 00:00:00 UTC. El alias de tiposys_dayses nuevo con C ++ 20, pero el tipo subyacente ha estado disponible desde C ++ 11 (time_point<system_clock, duration<int, ratio<86400>>>). Si usa la biblioteca de vista previa de código abierto C ++ 20 ,sys_daysestá ennamespace date.El siguiente código asume la función local:
para reducir la verbosidad Si está experimentando con la biblioteca de vista previa de código abierto C ++ 20 , también asuma:
Bóveda
Para generar las dos primeras líneas es simple:
Simplemente tome la fecha
sdy úselaformatcon las marcas familiaresstrftime/put_timepara imprimir la fecha y el texto. La biblioteca de vista previa de código abierto C ++ 20 aún no ha integrado la biblioteca fmt , por lo que utiliza la cadena de formato ligeramente alterada"%d %B %Y is a %A\n".Esto generará (por ejemplo):
Resultados intermedios comunes calculados una vez
Esta sección de la función se escribe en último lugar, porque todavía no se sabe qué cálculos se necesitarán varias veces. Pero una vez que sepa, aquí es cómo calcularlos:
Necesitaremos los campos de año y mes de
sd, y elweekday(día de la semana). Es eficiente calcularlos de una vez por todas de esta manera. También necesitaremos (varias veces) el primer y último día del año actual. Es difícil saberlo en este momento, pero es eficiente almacenar estos valores como tipo,sys_daysya que su uso posterior es solo con aritmética orientada al día, quesys_dayses muy eficiente a (velocidades inferiores a nanosegundos).Dato 1: número de días del año y días restantes del año
Esto imprime el número de día del año, siendo el 1 de enero el día 1, y luego también imprime el número de días restantes en el año, sin incluir
sd. El cálculo para hacer esto es trivial. Dividiendo cada resultado pordays{1}es una manera de extraer el número de días endnydlen un tipo integral para formatear propósitos.Dato 2: número de este día de la semana y número total de días de la semana en el año
wdes el día de la semana (de lunes a domingo) calculado en la parte superior de este artículo. Para realizar este cálculo, primero necesitamos las fechas de la primera y la últimawddel añoy.y/1/wd[1]es el primerowden enero yy/12/wd[last]es el últimowden diciembre.El número total de
wds en el año es solo el número de semanas entre estas dos fechas (más 1). La subexpresiónlast_wd - first_wdes el número de días entre las dos fechas. Dividir este resultado por 1 semana da como resultado un tipo integral que contiene el número de semanas entre las dos fechas.El número de la semana se realiza del mismo modo que el número total de semanas, excepto uno comienza con el día actual en lugar de la última
wdparte del año:sd - first_wd.Hecho 3: Número de este día de la semana y número total de días de la semana en el mes
Esto funciona igual que el Hecho 2, excepto que comenzamos con el primer y último
wds del par año-mes eny/mlugar de todo el año.Dato 4: número de días en el año
El código habla más o menos por sí mismo.
Hecho 5 Número de días en el mes
La expresión
y/m/lastes el último día del par año-mesy/my, por supuesto,y/m/1es el primer día del mes. Ambos se convierten parasys_daysque puedan restarse para obtener el número de días entre ellos. Agregue 1 para el recuento basado en 1.Utilizar
infose puede usar así:o así:
Aquí hay un ejemplo de salida:
Editar
Para aquellos que no son aficionados a la "sintaxis convencional", existe una "sintaxis de constructor" completa que se puede utilizar en su lugar.
Por ejemplo:
puede ser reemplazado por:
fuente
std::cout << "a*b = " << a*b << "; a^b = " << a^b << '\n';(que, afortunadamente, casi siempre se detecta en el momento de la compilación, pero sigue siendo una molestia). Por lo tanto, sería cauteloso al usar este nuevo abuso de operador de división.