Partager via


Classe ambiguous_local_time

Cette exception est levée lors de la tentative de conversion d’un local_time en un sys_time et le résultat peut être l’une des deux fois et ni l’un ni l’autre n’a choose::earliest choose::latest été spécifié pour régler l’ambiguïté.

Syntaxe

class ambiguous_local_time : public runtime_error; // C++20

Notes

Pendant la transition de l’heure d’été à l’heure standard à l’automne, les horloges gagnent essentiellement une heure supplémentaire. Cela peut être déroutant parce que la transition vers le temps standard signifie perdre une heure ? En revenant une heure, l’heure avant la transition sera répétée après l’ajustement de l’horloge pour l’heure standard. Considérez le changement de l’heure standard à New York, qui se produit le premier dimanche en novembre à 2h00. Tout d’abord, 1h00 va. À 2h00, l’horloge passe à l’heure standard, c’est donc à nouveau 1h00. Cela signifie que le temps entre 1h et 2h sera « répété », ajoutant effectivement une heure.

Si une local_time heure spécifiée pendant cette heure « supplémentaire », il n’est pas clair comment la convertir. L’heure convertie doit-elle être traitée comme la « première » fois que cette heure se produit, ou la « seconde » ? Si l’énumération choose n’est pas spécifiée pour indiquer ce qu’elle doit être, vous obtiendrez une ambiguous_local_time exception.

Ce problème n’existe pas lors de la conversion de l’heure standard en heure d’été. Dans ce cas, un problème différent peut survenir. Pour plus d'informations, consultez nonexistent_local_time.

L’exemple suivant montre une conversion ambiguë.

Exemple : ambiguous_local_time

#include <chrono>
#include <iostream>

using namespace std::chrono;
    
int main()
{
    try
    {
        // The following will throw an exception because converting 1:30am local time to system time could be interpreted as either 
        // 1:30 AM EDT or 1:30 AM EST. Which to choose isn't specified for the conversion, so an ambiguous_local_time
        // exception is thrown.
        auto zt = zoned_time{"America/New_York", local_days{Sunday[1]/November/2016} + 1h + 30min};
    } catch (const ambiguous_local_time& e)
    {
        std::cout << e.what() << '\n';
    }
    return 0;
}
2016-11-06 01:30:00 is ambiguous. It could be
2016-11-06 01:30:00 EDT == 2016-11-06 05:30:00 UTC or
2016-11-06 01:30:00 EST == 2016-11-06 06:30:00 UTC

Membres

Nom Description
Constructeur Construire un ambiguous_local_time.
what Obtient une chaîne qui décrit la nature de l’ambiguïté.

Spécifications

En-tête : <chrono> (depuis C++20)

Espace de noms : std::chrono

Option du compilateur : /std:c++latest

Constructeurs

Construit un objet ambiguous_local_time.

template<class Duration>
ambiguous_local_time(const local_time<Duration>& tp, const local_info& i);

Paramètres

tp
Ce local_time qui n’a pas pu être converti.

i
Informations sur la tentative de conversion. Pour plus d'informations, consultez local_info.

Notes

En règle générale, vous ne créez pas cette exception. Elle est levée par des fonctions qui convertissent un local_time sys_timeen .

what

Obtient une chaîne décrivant les détails de l’ambiguïté.

[[nodiscard]] virtual const char* what() const noexcept;

Valeur retournée

Chaîne décrivant l’ambiguïté. Par exemple :

2016-11-06 01:30:00 is ambiguous. It could be
2016-11-06 01:30:00 EDT == 2016-11-06 05:30:00 UTC or
2016-11-06 01:30:00 EST == 2016-11-06 06:30:00 UTC

Voir aussi

<chrono>
to_sys
nonexistent_local_time
Informations de référence sur les fichiers d’en-tête