Compartir vía


Clase ambiguous_local_time

Esta excepción se produce al intentar convertir un local_time en un sys_time y el resultado puede ser uno de los dos horarios, y no se especificóchoose::earliest ni choose::latest para resolver la ambigüedad.

Sintaxis

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

Comentarios

Durante la transición del horario de verano a la hora estándar en el otoño, los relojes básicamente obtienen una hora adicional. Esto puede resultar confuso porque la transición al tiempo estándar significa perder una hora. Al retroceder una hora, la hora anterior a la transición se repetirá después de que el reloj se ajuste para la hora estándar. Considere el cambio a la hora estándar en Nueva York, que ocurre el primer domingo de noviembre a las 2:00. En primer lugar, pasa la 1:00. A las 2:00, el reloj pasa a la hora estándar, por lo que ahora es la 1:00 de nuevo. Esto significa que el tiempo comprendido entre la 1:00 y las 2:00 se "repetirá", agregando eficazmente una hora.

Si un local_time especifica una hora durante esta hora "adicional", no está claro cómo convertirla. ¿Debe tratarse el tiempo convertido como la "primera" vez que se produce esa hora o la "segunda"? Si no se especifica la enumeración choose para indicar cuál debe ser, obtendrá una excepción de ambiguous_local_time.

Este problema no existe al convertir de la hora estándar al horario de verano. En ese caso, puede surgir un problema diferente. Para obtener información detallada, vea nonexistent_local_time.

En el ejemplo siguiente se muestra una conversión ambigua.

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

Miembros

Nombre Descripción
Constructor Construcción de un ambiguous_local_time.
what Obtiene una cadena que describe la naturaleza de la ambigüedad.

Requisitos

Encabezado: <chrono> (desde C++20)

Espacio de nombres: std::chrono

Opción del compilador: /std:c++latest

Constructores

Construye un objeto ambiguous_local_time.

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

Parámetros

tp
El local_time que no se pudo convertir.

i
Información sobre el intento de la conversión. Para obtener información detallada, vea local_info.

Comentarios

Normalmente, no creará esta excepción. Se produce mediante funciones que convierten un local_time en un sys_time.

what

Obtiene una cadena que describe los detalles de la ambigüedad.

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

Valor devuelto

Una cadena que describe la ambigüedad. Por ejemplo:

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

Consulte también

<chrono>
to_sys
nonexistent_local_time
Referencia de archivos de encabezado