https://www.timeanddate.com/date/weekday.html calcule divers faits concernant un jour de l'année, par exemple:
Étant donné une date arbitraire, comment ces nombres peuvent-ils être calculés avec la spécification chrono C ++ 20 ?
https://www.timeanddate.com/date/weekday.html calcule divers faits concernant un jour de l'année, par exemple:
Étant donné une date arbitraire, comment ces nombres peuvent-ils être calculés avec la spécification chrono C ++ 20 ?
Réponses:
C'est remarquablement facile avec la spécification chrono C ++ 20 . Ci-dessous, je montre une fonction qui entre une date arbitraire et imprime ces informations
cout
. Bien qu'au moment d'écrire ces lignes, la spécification de chrono C ++ 20 n'est pas encore disponible, elle est approximée par une bibliothèque open-source gratuite . Vous pouvez donc l'expérimenter aujourd'hui, et même l'inclure dans les applications d'expédition tant que vous adoptez C ++ 11 ou une version ultérieure.Cette réponse prendra la forme d'une fonction:
sys_days
est une précision de jourtime_point
dans lasystem_clock
famille. Cela signifie qu'il s'agit simplement d'un nombre de jours depuis le 1970-01-01 00:00:00 UTC. L'alias de typesys_days
est nouveau avec C ++ 20, mais le type sous-jacent est disponible depuis C ++ 11 (time_point<system_clock, duration<int, ratio<86400>>>
). Si vous utilisez la bibliothèque d'aperçu open-source C ++ 20 ,sys_days
est dansnamespace date
.Le code ci-dessous suppose une fonction locale:
pour réduire la verbosité. Si vous expérimentez avec la bibliothèque d'aperçu open-source C ++ 20 , supposez également:
Titre
La sortie des deux premières lignes est simple:
Il suffit de prendre la date
sd
et de l'utiliserformat
avec les drapeaux familiersstrftime
/put_time
pour imprimer la date et le texte. La bibliothèque d'aperçu open-source C ++ 20 n'a pas encore intégré la bibliothèque fmt , et utilise donc la chaîne de format légèrement modifiée"%d %B %Y is a %A\n"
.Cela produira (par exemple):
Résultats intermédiaires communs calculés une fois
Cette section de la fonction est écrite en dernier, car on ne sait pas encore quels calculs seront nécessaires plusieurs fois. Mais une fois que vous savez, voici comment les calculer:
Nous aurons besoin des champs année et mois de
sd
et duweekday
(jour de la semaine). Il est efficace de les calculer une fois pour toutes de cette manière. Nous aurons également besoin (plusieurs fois) des premier et dernier jours de l'année en cours. Il est difficile de dire à ce stade, mais il est efficace de stocker ces valeurs en tant que typesys_days
car leur utilisation ultérieure ne l'est qu'avec une arithmétique orientée vers le jour quisys_days
est très efficace à (vitesses inférieures à la nanoseconde).Fait 1: nombre de jours de l'année et nombre de jours restants dans l'année
Cela imprime le numéro de jour de l'année, le 1er janvier étant le jour 1, puis imprime également le nombre de jours restants dans l'année, sans inclure
sd
. Le calcul pour ce faire est trivial. La division de chaque résultat pardays{1}
permet d'extraire le nombre de jours dansdn
etdl
en un type intégral à des fins de formatage.Fait 2: Numéro de ce jour de semaine et nombre total de jours de semaine dans l'année
wd
est le jour de la semaine (du lundi au dimanche) calculé en haut de cet article. Pour effectuer ce calcul, nous avons d'abord besoin des dates du premier et du dernierwd
de l'annéey
.y/1/wd[1]
est le premierwd
en janvier ety/12/wd[last]
le dernierwd
en décembre.Le nombre total de
wd
s dans l'année n'est que le nombre de semaines entre ces deux dates (plus 1). La sous-expressionlast_wd - first_wd
est le nombre de jours entre les deux dates. En divisant ce résultat par 1 semaine, vous obtenez un type intégral contenant le nombre de semaines entre les deux dates.Le numéro de la semaine se fait de la même manière que le nombre total de semaines , sauf un commence par le jour en cours au lieu de la dernière
wd
de l'année:sd - first_wd
.Fait 3: Numéro de ce jour de semaine et nombre total de jours de semaine dans le mois
Cela fonctionne exactement comme le fait 2, sauf que nous commençons par le premier et le dernier
wd
s de la paire année-moisy/m
au lieu de l'année entière.Fait 4: Nombre de jours dans l'année
Le code parle à peu près de lui-même.
Fait 5 Nombre de jours dans le mois
L'expression
y/m/last
est le dernier jour de la paire année-moisy/m
, et bien sûry/m/1
le premier jour du mois. Les deux sont convertis ensys_days
afin qu'ils puissent être soustraits pour obtenir le nombre de jours entre eux. Ajoutez 1 pour le nombre basé sur 1.Utilisation
info
peut être utilisé comme ceci:ou comme ça:
Voici un exemple de sortie:
Éditer
Pour ceux qui ne sont pas friands de la "syntaxe conventionnelle", il existe une "syntaxe constructeur" complète qui peut être utilisée à la place.
Par exemple:
peut être remplacé par:
la source
std::cout << "a*b = " << a*b << "; a^b = " << a^b << '\n';
(qui, heureusement, est presque toujours pris au moment de la compilation, mais qui est toujours une gêne). Je serais donc prudent lors de l'utilisation de ce nouvel abus d'opérateur de division.