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_days
Es un día de precisióntime_point
en lasystem_clock
familia. Eso significa que es simplemente un recuento de días desde 1970-01-01 00:00:00 UTC. El alias de tiposys_days
es 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_days
está 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
sd
y úselaformat
con las marcas familiaresstrftime
/put_time
para 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_days
ya que su uso posterior es solo con aritmética orientada al día, quesys_days
es 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 endn
ydl
en 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
wd
es 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 últimawd
del añoy
.y/1/wd[1]
es el primerowd
en enero yy/12/wd[last]
es el últimowd
en diciembre.El número total de
wd
s en el año es solo el número de semanas entre estas dos fechas (más 1). La subexpresiónlast_wd - first_wd
es 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
wd
parte 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
wd
s del par año-mes eny/m
lugar 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/last
es el último día del par año-mesy/m
y, por supuesto,y/m/1
es el primer día del mes. Ambos se convierten parasys_days
que puedan restarse para obtener el número de días entre ellos. Agregue 1 para el recuento basado en 1.Utilizar
info
se 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.