Udostępnij za pośrednictwem


Klasa ambiguous_local_time

Ten wyjątek jest zgłaszany podczas próby przekonwertowania local_time elementu na wartość sys_time , a wynik może być jeden z dwóch razy i nie określono ani choose::earliest choose::latest nie został określony w celu uregulowania niejednoznaczności.

Składnia

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

Uwagi

Podczas przejścia od czasu letniego do czasu standardowego jesienią zegary zasadniczo zyskują dodatkową godzinę. Może to być mylące, ponieważ nie przejście do czasu standardowego oznacza utratę godziny? Spadając co godzinę, godzina przed przejściem będzie powtarzana po zegarze dostosowuje się do standardowego czasu. Rozważ zmianę czasu standardowego w Nowym Jorku, która ma miejsce w pierwszą niedzielę w listopadzie o godzinie 2:00. Po pierwsze, 1:00 idzie dalej. O 2 rano zegar przechodzi do czasu standardowego, więc teraz znowu jest 1:00. Oznacza to, że czas między 1 rano a 2 rano będzie "powtarzany", skutecznie dodając godzinę.

Jeśli parametr local_time określa czas w tej "dodatkowej" godzinie, nie jest jasne, jak go przekonwertować. Czy przekonwertowany czas powinien być traktowany jako "pierwszy" czas, który się dzieje, czy "drugi"? Jeśli wyliczenie choose nie jest określone, aby wskazać, które powinno być, otrzymasz ambiguous_local_time wyjątek.

Ten problem nie istnieje podczas konwertowania z czasu standardowego na czas letni. W takim przypadku może wystąpić inny problem. Zobacz nonexistent_local_time , aby uzyskać szczegółowe informacje.

W poniższym przykładzie przedstawiono niejednoznaczną konwersję.

Przykład: 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

Elementy członkowskie

Nazwa/nazwisko opis
Konstruktor Skonstruuj element ambiguous_local_time.
what Pobiera ciąg opisujący charakter niejednoznaczności.

Wymagania

Nagłówek: <chrono> (od C++20)

Przestrzeń nazw: std::chrono

Opcja kompilatora: /std:c++latest

Konstruktory

Tworzy element ambiguous_local_time.

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

Parametry

tp
Nie można przekonwertować elementu local_time .

i
Informacje o próbie konwersji. Zobacz local_info , aby uzyskać szczegółowe informacje.

Uwagi

Zazwyczaj nie można utworzyć tego wyjątku. Jest on zgłaszany przez funkcje, które konwertują local_time sys_timeelement na .

what

Pobiera ciąg opisujący szczegóły niejednoznaczności.

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

Wartość zwracana

Ciąg opisujący niejednoznaczność. Na przykład:

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

Zobacz też

<chrono>
to_sys
nonexistent_local_time
Odwołanie do plików nagłówka