Compartilhar via


Classe ambiguous_local_time

Essa exceção é gerada ao tentar converter uma local_time em um sys_time e o resultado pode ser uma de duas vezes e nenhuma choose::earliest ou choose::latest foi especificada para resolver a ambiguidade.

Sintaxe

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

Comentários

Durante a transição do horário de verão para o horário padrão no outono, os relógios essencialmente ganham uma hora extra. Pode ser confuso, pois a transição para o horário normal não significa perder uma hora? Ao voltar uma hora, o horário antes da transição será repetido depois que o relógio se ajustar para o horário normal. Pense na mudança no horário normal em Nova York, que acontece no primeiro domingo de novembro às 2h da manhã. Primeiro, passa 1h da manhã. Às 2h, o relógio faz a transição para o horário normal, então agora são 1h da manhã novamente. Isso significa que o horário entre 1h e 2h será "repetido", adicionando efetivamente uma hora.

Se um local_time especificar um horário durante essa hora "extra", não fica claro como convertê-lo. O horário convertido deve ser tratado como a "primeira" vez que ocorre essa hora ou a "segunda"? Se a enumeração choose não for especificada para indicar qual deve ser, você receberá uma exceção ambiguous_local_time.

Esse problema não existe quando convertemos do horário normal para o horário de verão. Nesse caso, um problema diferente pode surgir. Confira nonexistent_local_time para obter detalhes.

O exemplo a seguir mostra uma conversão ambígua.

Exemplo: 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

Membros

Nome Descrição
Construtor Constrói um ambiguous_local_time.
what Obtém uma cadeia de caracteres que descreve a natureza da ambiguidade.

Requisitos

Cabeçalho: <chrono> (desde C++20)

Namespace: std::chrono

Opção do compilador: /std:c++latest

Construtores

Constrói um ambiguous_local_time.

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

Parâmetros

tp
O local_time que não pôde ser convertido.

i
Informações sobre a tentativa de conversão. Confira local_info para obter detalhes.

Comentários

Normalmente, você não criará essa exceção. Ela é gerada por funções que convertem um local_time em um sys_time.

what

Obtém uma cadeia de caracteres que descreve os detalhes da ambiguidade.

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

Valor retornado

Uma cadeia de caracteres que descreve a ambiguidade. Por exemplo:

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

Confira também

<chrono>
to_sys
nonexistent_local_time
Referência de Arquivos de Cabeçalho