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_time
en .
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