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