2 votes

C++ std::tm renvoie une valeur erronée après sa conversion depuis std::chrono::time_point

TL;DR : Comment utiliser un std::chrono::system_clock::time_point pour comparer sur la base de certains paramètres seulement (par exemple, je veux seulement les heures, les minutes et les secondes, mais pas le jour, le mois, etc.)

Aussi : Après avoir converti le std::chrono::system_clock::time_point à un std::tm El std::tm.tm_hours contient une valeur supérieure d'une unité à l'entrée initiale de la fonction std::chrono::system_clock::time_point .


Mon approche théorique sur l'obtention d'un std::chrono::system_clock::time_point pour travailler :

typedef std::chrono::system_clock::time_point TimePoint;

TimePoint MainWindow::createTimePoint(int h, int m)
{
    TimePoint createdTime = std::chrono::system_clock::time_point{std::chrono::hours(h) + std::chrono::minutes(m)};

    time_t tt = std::chrono::system_clock::to_time_t(createdTime);
    tm timeExtracted = *localtime(&tt);

    std::cout << "input:\t\t" << "H = " << h << ", M = " << m << std::endl; 
    std::cout << "timeExtracted:\t" << "H = " << timeExtracted.tm_hour << ", M = " << timeExtracted.tm_min << std::endl; 

    return createdTime;
}

Si je fais ça, les heures de timeExtracted sont toujours +1 à partir de l'entrée h .

Pourquoi en est-il ainsi ? Et comment y remédier ? J'ai parcouru quelques autres posts qui montraient cela, mais ils n'ont pas pu m'aider. Probablement aussi à cause de ceci :

Je pense que lorsque je crée un TimePoint le jour, le mois, etc. est également réglé sur une valeur aléatoire ou initié à une certaine valeur. Le problème est le suivant : Je veux qu'ils soient toujours de la même valeur, afin que mon TimePoint (après conversion) montre essentiellement ceci :

timeExtracted.tm_sec = 0
timeExtracted.tm_min = m
timeExtracted.tm_hour = h
timeExtracted.tm_mon = 0
timeExtracted.tm_wday = 0
timeExtracted.tm_mday = 0
timeExtracted.tm_yday = 0
timeExtracted.tm_year = 0
timeExtracted.tm_isdst = 0

Comment puis-je comparer deux de ces TimePoint en utilisant les opérations de comparaison de std::chrono sur eux, mais en ne comparant que l'heure et la minute.


Si ma question n'est pas claire, je suis désolé, il est tard dans la soirée. Je vérifierai à nouveau demain matin. Merci.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X