Namespaces
Variants

std::chrono:: is_am, std::chrono:: is_pm, std::chrono:: make12, std::chrono:: make24

From cppreference.net
Definido en el encabezado <chrono>
constexpr bool is_am ( const std:: chrono :: hours & h ) noexcept ;
(1) (desde C++20)
constexpr bool is_pm ( const std:: chrono :: hours & h ) noexcept ;
(2) (desde C++20)
constexpr std:: chrono :: hours make12 ( const std:: chrono :: hours & h ) noexcept ;
(3) (desde C++20)
constexpr std:: chrono :: hours make24 ( const std:: chrono :: hours & h,
bool is_pm ) noexcept ;
(4) (desde C++20)

Estas funciones ayudan a traducir entre una hora del día en formato de 12 horas y una hora del día en formato de 24 horas.

1) Detecta si el formato de 24 horas es a.m. ( ante meridiem , antes del mediodía).
2) Detecta si la hora en formato de 24 horas es p.m. ( post meridiem , después del mediodía).
3) Devuelve el equivalente en formato 12 horas de una hora en formato 24 horas.
4) Devuelve el equivalente de 24 horas de un tiempo en formato de 12 horas h , donde is_pm determina si el tiempo es p.m.

Parámetros

h - Formato de hora de 12 o 24 horas a detectar
is_pm - si la hora en formato de 12 horas es p.m.

Valor de retorno

1) 0h <= h && h <= 11h
2) 12h <= h && h <= 23h
3) Si h está en el rango [ 0h , 23h ] , retorna el equivalente de 12 horas en el rango [ 1h , 12h ] . De lo contrario, el valor de retorno no está especificado.
4) Si h está en el rango [ 1h , 12h ] , devuelve el equivalente en formato 24 horas en el rango [ 0h , 11h ] si is_pm es false , o en el rango [ 12h , 23h ] en caso contrario. De lo contrario, el valor de retorno no está especificado.

Ejemplo

#include <chrono>
#include <iomanip>
#include <iostream>
#include <utility>
int main()
{
    using namespace std::chrono;
    static_assert(
        is_am(10h) &&  is_am(11h) && !is_am(12h) && !is_am(23h) &&
       !is_pm(10h) && !is_pm(11h) &&  is_pm(12h) &&  is_pm(23h)
    );
    std::cout << "make12():\n";
    for (const hours hh : {0h, 1h, 11h, 12h, 13h, 23h})
    {
        const hours am{make12(hh)};
        std::cout << std::setw(2) << hh.count() << "h == "
                  << std::setw(2) << am.count() << (is_am(hh) ? "h a.m.\n" : "h p.m.\n");
    }
    std::cout << "\nmake24():\n";
    using p = std::pair<hours, bool>;
    for (const auto& [hh, pm] : {p{1h, 0}, p{12h, 0}, p{1h, 1}, p{12h, 1}})
    {
        std::cout << std::setw(2) << hh.count()
                  << (pm ? "h p.m." : "h a.m.")
                  << " == " << std::setw(2)
                  << make24(hh, pm).count() << "h\n";
    }
}

Salida:

make12():
 0h == 12h a.m.
 1h ==  1h a.m.
11h == 11h a.m.
12h == 12h p.m.
13h ==  1h p.m.
23h == 11h p.m.
make24():
 1h a.m. ==  1h
12h a.m. ==  0h
 1h p.m. == 13h
12h p.m. == 12h