pedir - sacar fecha c++
¿Cómo puede una implementación de C++ conforme indicar que no conoce la fecha y hora actuales? (1)
Se debe hacer una distinción entre saber el tiempo y saber el momento correcto .
Si se enciende un dispositivo de este tipo, puede asumir libremente que su contador de ciclos de la CPU (o cualquiera que sea la función steady_clock
) representa el número de ciclos desde el tiempo de UNIX. Es decir, puede suponer que se encendió en el momento de la época de UNIX. Esa sería una implementación válida de system_clock
. Es probable que ese tiempo no sea correcto en algún sentido absoluto, pero será una implementación conforme a C ++ 20.
El estándar simplemente requiere que la época de system_clock sea tiempo UNIX (o más específicamente, todos podemos asumir que es tiempo UNIX). Eso no significa que la cuenta de tics recuperada para el reloj esté garantizada como la hora actual globalmente precisa. Después de todo, el usuario puede cambiar técnicamente la hora actual, que debe reflejarse en system_clock
(razón por la cual no se requiere que sea un reloj estable).
Como tal, nunca se podría asumir que system_clock
representó con precisión la hora actual; solo representa lo que el entorno operativo piensa que es la hora actual. Así que no hay forma de que el chrono
explique que la hora actual es o no es "correcta" en cierto sentido.
system_clock
está básicamente destinado a proporcionar lo que sea más cercano a la hora correcta del día que el sistema pueda proporcionar o entender. Si lo mejor que puede hacer el sistema es asumir que el dispositivo se encendió en la época de UNIX, eso es lo que obtienes.
Además, dado que system_clock
(y todo <chrono>
para el caso) no está en la lista de requisitos independientes , las implementaciones de C ++ para tales dispositivos podrían ser implementaciones independientes. Y, por lo tanto, eligen no implementar system_clock
(o todo <chrono>
) en absoluto.
Algunas implementaciones de C ++ (por ejemplo, dispositivos integrados alimentados por batería) pueden no tener uso o no tienen forma de rastrear la fecha y hora actuales.
El estándar C permite específicamente tales implementaciones. Para citar de ISO / IEC 9899: 1999 7.23.2.4 (énfasis mío):
La función de tiempo devuelve la mejor aproximación de la implementación al tiempo del calendario actual. El valor (time_t) (- 1) se devuelve si el tiempo del calendario no está disponible.
C ++ 11 introdujo la biblioteca chrono
y la función std::chrono::system_clock::now()
para obtener la hora del reloj de pared del reloj en tiempo real de todo el sistema. La función se declara como noexcept
, por lo que no puede lanzar ninguna excepción para indicar la indisponibilidad ni permite devolver ningún valor especial (como -1
en el caso de C).
Pero con C ++ 11, C ++ 14 y C ++ 17 todavía había una laguna. La norma no especificaba la época del reloj, por lo que una implementación conforme podría establecer la época en el momento en que se encendió (o se inició el programa) y seguir cumpliendo los requisitos de la norma.
El borrador actual de C ++ 20 cerrará esa laguna y requerirá que system_clock
use el tiempo Unix. En otras palabras, una implementación de C ++ que no conoce la hora actual no es conforme.
¿Es esto un descuido por el comité de normas? ¿Cómo puede una implementación de C ++ conforme indicar que no conoce la fecha y hora actuales?
(Tenga en cuenta que en otras partes de la norma se resuelve este problema. Por ejemplo, una implementación puede configurar las macros __TIME__
y __DATE__
en un valor definido por la implementación si la fecha y la hora reales no están disponibles).