Nouvelles Du Monde

Heure en C++20 : nouveaux types de données pour l’heure et la date du calendrier

Heure en C++20 : nouveaux types de données pour l’heure et la date du calendrier

2024-03-25 13:31:00

Publicité

Après les articles sur les types de données de base pour la fonctionnalité chrono, je m’intéresse cette fois à un nouveau type de données en C++20.


Rainer Grimm travaille depuis de nombreuses années en tant qu’architecte logiciel, responsable d’équipe et de formation. Il aime écrire des articles sur les langages de programmation C++, Python et Haskell, mais aime également intervenir fréquemment lors de conférences spécialisées. Sur son blog Modern C++, il parle intensément de sa passion C++.



std::chrono::hh_mm_ss est la durée depuis minuit, divisée en heures, minutes, secondes et fractions de secondes. Ce type de données est généralement utilisé comme outil de formatage. Le tableau suivant donne dans un premier temps un bref aperçu des std::chrono::hh_mm_sexemple tOfDay.



En fonction de la durée utilisée, le membre statique renvoie celle appropriée tOfDay.fractional_width. Si aucune valeur pour fractional_width dans la zone [0, 18]existe, est fractional_width est égal à 6. Voir par exemple std::chrono::duration> dans le tableau suivant.



L’utilisation du type de données std::chrono::hh_mm_ss C’est vraiment facile.

// timeOfDay.cpp

#include 
#include 

int main() {
                                                            
  using namespace std::chrono_literals; 

  std::cout << std::boolalpha << 'n';
    
  auto timeOfDay = 
    std::chrono::hh_mm_ss(10.5h + 98min + 2020s + 0.5s);   // (1)
    
  std::cout<< "timeOfDay: " << timeOfDay << 'n';          // (2)

  std::cout << 'n';

  std::cout << "timeOfDay.hours(): " 
            << timeOfDay.hours() << 'n';                  // (4)
  std::cout << "timeOfDay.minutes(): " 
            << timeOfDay.minutes() << 'n';                // (4)
  std::cout << "timeOfDay.seconds(): " 
            << timeOfDay.seconds() << 'n';                // (4)
  std::cout << "timeOfDay.subseconds(): " 
            << timeOfDay.subseconds() << 'n';             // (4)
  std::cout << "timeOfDay.to_duration(): " 
            << timeOfDay.to_duration() << 'n';            // (5)

  std::cout << 'n';

  std::cout << "std::chrono::hh_mm_ss(45700.5s): " 
            << std::chrono::hh_mm_ss(45700.5s) << 'n';    // (6)

  std::cout << 'n';

  std::cout << "std::chrono::is_am(5h): " 
            << std::chrono::is_am(5h) << 'n';             // (7)    
  std::cout << "std::chrono::is_am(15h): " 
            << std::chrono::is_am(15h) << 'n';            // (7)

  std::cout << 'n';
  
  std::cout << "std::chrono::make12(5h): " 
            << std::chrono::make12(5h) << 'n';            // (7)   
  std::cout << "std::chrono::make12(15h): " 
            << std::chrono::make12(15h) << 'n';           // (7) 
}

Dans (1) je crée une nouvelle instance de std::chrono::hh_mm_ss: timeOfDay. Grâce aux littéraux Chrono de C++14, je peux ajouter quelques durées pour initialiser un objet Time of Day. Avec C++20, vous pouvez timeOfDay sortie directement (2). Le reste devrait être facile à lire. (4) renvoie les composantes du temps depuis minuit en heures, minutes, secondes et fractions de seconde. (5) renvoie le temps écoulé depuis minuit en secondes. (6) est plus intéressant : les secondes données correspondent au temps indiqué en (2). (7) indique si l'heure spécifiée est le matin. (8) renvoie enfin l'équivalent de 12 heures de l'heure spécifiée.

Voici le résultat du programme :



Un nouveau type de données de l'extension Chrono en C++20 est une date calendaire. C++20 prend en charge différentes manières de créer et d'interagir avec une date de calendrier. Tout d’abord, à quoi ressemble une date calendaire ?

  • UN Date du calendrier se compose d'une année, d'un mois et d'un jour. C'est pourquoi il existe un type de données spécial en C++20 std::chrono::year_month_day. C++20 a bien plus à offrir. Le tableau suivant est destiné à fournir un aperçu des types de calendrier avant de présenter différents cas d'utilisation.



Grace à Syntaxe mignonne tu peux std::chrono::operator / utiliser pour créer des dates du calendrier grégorien.

Les types de données de calendrier prennent en charge diverses opérations. Le tableau suivant en donne un aperçu. Pour des raisons de lisibilité, j'ignore partiellement l'espace de noms std::chrono.



Les opérations d'incrémentation et de décrémentation ++/-- sont pris en charge dans les versions préfixe et postfixe. Ajouter ou soustraire +/- nécessite des objets de type de données std::chrono::duration. Autrement dit, si vous prenez la différence entre deux objets du type de données std::chrono::day formulaires, vous obtenez un objet de type std::chrono::days. <=> est le nouvel opérateur de comparaison à trois facteurs.

Le programme suivant utilise les opérations pour les types de calendrier :

// calendarOperations.cpp

#include 
#include 

int main() {

  std::cout << 'n';

  using std::chrono::Monday;
  using std::chrono::Saturday;

  using std::chrono::March;
  using std::chrono::June;
  using std::chrono::July;

  using std::chrono::days;
  using std::chrono::months;
  using std::chrono::years;

  using std::chrono::last;

  using namespace std::chrono_literals;

  std::cout << std::boolalpha;

  std::cout << "March: " << March << 'n';  
  std::cout << "March + months(3): " 
            << March + months(3) << 'n';                // (1)
  std::cout << "March - months(25): " 
            << March - months(25) << 'n';               // (5)  
  std::cout << "July - June: " <<  July - June 
            << 'n';                                     // (6)
  std::cout << "June < July: " << (June < July) << 'n'; // (7)

  std::cout << 'n';
 
  std::cout << "Saturday: " << Saturday << 'n';
  std::cout << "Saturday + days(3): " 
            << Saturday + days(3) << 'n';                // (2)
  std::cout << "Saturday - days(22): " 
            << Saturday - days(22) << 'n';               // (8)
  std::cout << "Saturday - Monday: " 
            <<  Saturday - Monday << 'n';                // (9)

  std::cout << 'n';

  std::cout << "2021y/March: " << 2021y/March << 'n';    // (3)
  std::cout << "2021y/March + years(3) - months(35): "    // (10)
            << 2021y/March + years(3) - months(35) << 'n';
  std::cout << "2022y/July - 2021y/June: " 
            << 2022y/July - 2021y/June << 'n';           // (11)
  std::cout << "2021y/June > 2021y/July: " 
            << (2021y/June > 2021y/July) << 'n';         // (12)

  std::cout << 'n';

  std::cout << "2021y/March/Saturday[last]: " 
            << 2021y/March/Saturday[last] << 'n';        // (4)
  std::cout << "2021y/March/Saturday[last] + months(13) " +
               "+ years(3): " 
            << 2021y/March/Saturday[last] + 
               months(13) + years(3) << 'n';
  std::cout << "2021y/July/Saturday[last] - months(1) == " + 
               " 2021y/June/Saturday[last]: "
            << (2021y/July/Saturday[last] - months(1) == 
                2021y/June/Saturday[last]) 
            << 'n';

  std::cout << 'n';

}

Le programme effectue des opérations std::chrono::month (1), std::chrono::weekday (2), std::chrono::year_month (3) et std::chrono::year_month_weekday_last (4) à travers.



Lors de l'ajout ou de la soustraction de la durée std::chrono::months Les opérations Modulo sont automatiquement appliquées (5 et 6). La soustraction de deux std::chrono::month-Objets équivaut à 1 mois. Un mois a 2629746 Secondes (7). En conséquence, vous pouvez définir une période de temps std::chrono::days aux données du calendrier std::chrono::day ajoutez-en ou soustrayez-les (8 et 9). La soustraction de deux std::chrono::day-Les objets donnent lieu à un std::chrono::days-Objet. std::chrono::year_month permet la soustraction (10), la différence (11) et la comparaison de points dans le temps (12). Objets de type std::chrono::weekday_last permettre l'ajout/soustraction de périodes std::chrono::months et std::chrono::years. De plus, ceux-ci peuvent std::chrono::weekday_last-Les objets peuvent être comparés entre eux.

C++20 prend en charge les constantes et les littéraux pour rendre l'utilisation des types de données plus pratique.


(moi)

Vers la page d'accueil



#Heure #C20nouveaux #types #données #pour #lheure #date #calendrier
1711701985

Facebook
Twitter
LinkedIn
Pinterest

Leave a Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.

ADVERTISEMENT