# Hora del sistema

En informática y programación, la hora del sistema representa la noción que tiene un sistema informático del paso del tiempo. En este sentido, el "tiempo" también incluye el paso de los días en el calendario.
La hora del sistema se mide mediante un "reloj del sistema", que normalmente se implementa como un simple recuento del número de "ticks" que han transcurrido desde una fecha de inicio arbitraria, llamada época. Por ejemplo, los sistemas Unix y POSIX codifican la hora del sistema ("Tiempo Unix") como el número de segundos transcurridos desde el inicio del Tiempo Unix el 1 de enero de 1970 a las 00:00:00 UT (Universal Time; Tiempo Universal), con excepciones para los segundos intercalares. Los sistemas que implementan las versiones de 32 y 64 bits de la API de Windows, como Windows 9x y Windows NT, proporcionan la hora del sistema como SYSTEMTIME, representada como un valor de año/mes/día/hora/minuto/segundo/milisegundos y FILETIME, representada como un recuento del número de ticks de 100 nanosegundos desde el 1 de enero de 1601 00:00:00 UT según el calendario gregoriano proléptico.
La hora del sistema puede convertirse en hora del calendario, que es una forma más adecuada para la comprensión humana. Por ejemplo, la hora del sistema Unix 1.000.000.000 segundos desde el comienzo de la época se traduce en el tiempo de calendario 9 de septiembre de 2001 01:46:40 UT. Las subrutinas de la biblioteca que gestionan estas conversiones también pueden encargarse de los ajustes de las zonas horarias, el horario de verano (DST: Daylight Saving Time), los segundos intercalares y la configuración regional del usuario. También se suelen proporcionar rutinas de biblioteca que convierten las horas del calendario en horas del sistema.
Muchas aplicaciones que actualmente almacenan las horas del sistema como valores enteros de 32 bits se verán afectadas por el inminente problema del año 2038. Estos valores de tiempo se saturarán ("se quedarán sin bits") una vez finalizada la época en la hora del sistema, lo que provocará errores de software y hardware. Estos sistemas requerirán algún tipo de remedio, similar a los esfuerzos necesarios para resolver el anterior problema del año 2000. También será un problema potencialmente mucho mayor para los formatos de archivos de datos existentes que contienen marcas de la hora del sistema almacenadas como valores de 32 bits.

## Otras medidas de tiempo

El tiempo de proceso, estrechamente relacionado con el la hora del sistema, es un recuento del tiempo total de CPU (Central Processing Unit; Unidad Central de Procesamiento) consumido por un proceso en ejecución. Puede dividirse en tiempo de CPU de "usuario" y de "sistema", que representan el tiempo dedicado a ejecutar el código de usuario y el código del núcleo del sistema, respectivamente. Los tiempos de proceso son un recuento de instrucciones de CPU o ciclos de reloj y generalmente no tienen correlación directa con el tiempo de inactividad.
Los sistemas de archivos llevan la cuenta de las veces que se crean, modifican y/o acceden a los archivos almacenando marcas de tiempo en el bloque de control del archivo (o inodo) de cada archivo y directorio.

## Historia

La mayoría de las computadoras personales de la primera generación no llevaban un registro de fechas y horas. Entre ellos se encontraban los sistemas que ejecutaban el sistema operativo CP/M (Control Program for Microcomputers; Programa de Control para Microordenadores), así como los primeros modelos del Apple II, el BBC Micro y el Commodore PET, entre otros. El IBM PC y el XT disponían de tarjetas periféricas complementarias que incluían chips de reloj en tiempo real con batería de reserva integrada, pero el IBM AT fue la primera computadora ampliamente disponible que venía equipado con hardware de fecha/hora integrado en la placa base. Antes de la generalización de las redes informáticas, la mayoría de los sistemas informáticos personales que hacían un seguimiento de la hora del sistema lo hacían sólo con respecto a la hora local y no tenían en cuenta las distintas zonas horarias.
Con la tecnología actual, la mayoría de las computadoras modernas siguen la hora civil local, al igual que muchos otros dispositivos domésticos y personales como videograbadoras, Grabador de video digital, receptores de televisión por cable, Asistente Digital Personal, localizadores, teléfonos móviles, faxes, contestadores automáticos, cámaras, videocámaras, aires acondicionados centrales y hornos microondas.
Los microcontroladores que operan dentro de sistemas embebidos (como el Raspberry Pi, Arduino y otros sistemas similares) no siempre disponen de hardware interno para llevar la cuenta del tiempo. Muchos sistemas controladores de este tipo funcionan sin conocimiento de la hora externa. Aquellos que requieren dicha información suelen inicializar su hora base al reiniciar obteniendo la hora actual de una fuente externa, como un servidor horario o un reloj externo o solicitando al usuario que introduzca manualmente la hora actual.

## Aplicación

El reloj del sistema se implementa normalmente como un temporizador de intervalo programable que interrumpe periódicamente la CPU, que entonces comienza a ejecutar una rutina de servicio de interrupción del temporizador. Esta función suele añadir un tick al reloj del sistema (un simple contador) y se encarga de otras tareas de mantenimiento periódicas (multitarea, entre otros) antes de volver a la tarea que la CPU estaba ejecutando antes de la interrupción.

## Recuperación de la hora del sistema

* 11 octubre 2024 21:52:26 UTC
* La hora del sistema de Wikipedia en que se generó esta página por última vez. → Borre esta página y actualice este contador.
Las siguientes tablas muestran métodos para recuperar la hora del sistema en varios sistemas operativos, lenguajes de programación y aplicaciones. Los valores marcados con (*) dependen del sistema y pueden variar según la versión. Todas las fechas se indican como fechas del calendario gregoriano o gregoriano proléptico.
La resolución de la medición del tiempo de una aplicación no implica la misma precisión de dichas mediciones. Por ejemplo, un sistema puede devolver la hora actual como un valor medido en microsegundos, pero en realidad ser capaz de discernir las pulsaciones individuales del reloj con una frecuencia de sólo 100 Hz (10 ms).

### Sistemas operativos

| Sistema operativo | Comando o función | Resolución | Época o rango |
| Android | java.lang .System.currentTimeMillis | 1 ms | 1 de enero de 1970 |
| BIOS (IBM PC) | INT 1Ah, AH=00h | 54.9254 ms 18.2065 Hz | Medianoche del día en curso |
| BIOS (IBM PC) | INT 1Ah, AH=02h | 1 s | Medianoche del día en curso |
| BIOS (IBM PC) | INT 1Ah, AH=04h | 1 día | 1 de enero de 1980 a 31 de diciembre de 1999 o al 31 de diciembre de 2079 (en función del sistema) |
| CP/M Plus | Bloque de control del sistema: scb$base+58h, Días transcurridos desde el 31 de diciembre de 1977 scb$base+5Ah, Hora (BCD) scb$base+5Bh, Minuto (BCD) scb$base+5Ch, Segundo (BCD) | 1 s | 31 de diciembre de 1977 a 5 de junio de 2157 |
| CP/M Plus | Función BDOS 69h> (T_GET): word, Días transcurridos desde el 1 de enero de 1978 byte, Hora (BCD) byte, Minuto (BCD) byte, Segundo (BCD) | 1 s | 31 de diciembre de 1977 a 5 de junio de 2157 |
| DOS (Microsoft) | C:\> DATE C:\> TIME | 10 ms | 1 de enero de 1980 a 31 de diciembre de 2099 |
| DOS (Microsoft) | INT 21h, AH=2Ch SYSTEM TIME INT 21h, AH=2Ah SYSTEM DATE | 10 ms | 1 de enero de 1980 a 31 de diciembre de 2099 |
| iOS (Apple) | CFAbsoluteTimeGetCurrent | < 1 ms | 1 de enero de 2001 ±10.000 años |
| macOS | CFAbsoluteTimeGetCurrent | < 1 ms | 1 de enero de 2001 ±10.000 años |
| OpenVMS | SYS$GETTIM | 100 ns | 17 de noviembre de 1858 a 31 de julio de 31.086 |
| OpenVMS | gettimeofday | 1 μs | 1 de enero de 1970 a 7 de febrero de 2106 |
| OpenVMS | clock_gettime | 1 ns | 1 de enero de 1970 a 7 de febrero de 2106 |
| z/OS | STCK | 2$^{−12}$ μs 244.14 ps | 1 de enero de 1900 a 17 de septiembre de 2042 UT |
| z/OS | STCKE | 2$^{−12}$ μs 244.14 ps | 1 de enero de 1900 a 36.765 d.C. |
| Unix, POSIX (consulte las Funciones de fecha y hora en C) | $ date time | 1 s | (*) 1 de enero de 1970 (a el 19 de enero de 2038 antes de Linux 5.9) a el 2 de julio de 2486 (desde Linux 5.10) 1 de enero de 1970 a 4 de diciembre de AD 292.277.026.596 |
| Unix, POSIX (consulte las Funciones de fecha y hora en C) | gettimeofday | 1 μs | (*) 1 de enero de 1970 (a el 19 de enero de 2038 antes de Linux 5.9) a el 2 de julio de 2486 (desde Linux 5.10) 1 de enero de 1970 a 4 de diciembre de AD 292.277.026.596 |
| Unix, POSIX (consulte las Funciones de fecha y hora en C) | clock_gettime | 1 ns | (*) 1 de enero de 1970 (a el 19 de enero de 2038 antes de Linux 5.9) a el 2 de julio de 2486 (desde Linux 5.10) 1 de enero de 1970 a 4 de diciembre de AD 292.277.026.596 |
| OS/2 | DosGetDateTime | 10 ms | 1 de enero de 1980 a 31 de diciembre de 2079 |
| Windows | GetSystemTime | 1 ms | 1 de enero de 1601 a 14 de septiembre de 30828, 02:48:05.4775807 |
| Windows | GetSystemTimeAsFileTime | 100 ns | 1 de enero de 1601 a 14 de septiembre de 30828, 02:48:05.4775807 |
| Windows | GetSystemTimePreciseAsFileTime | 100 ns | 1 de enero de 1601 a 14 de septiembre de 30828, 02:48:05.4775807 |

### Lenguajes y aplicaciones de programación

| Idioma/Aplicación | Función o variable | Resolución | Época o rango |
| Ada | Ada.Calendar.Clock | 100 μs hasta 20 ms (*) | 1 de enero de 1901 a 31 de diciembre de 2099 (*) |
| AWK | systime | 1 s | (*) |
| BASIC, True BASIC | DATE, DATE$ TIME, TIME$ | 1 s | (*) |
| Business BASIC | DAY, TIM | 0.1 s | (*) |
| C (consulte las Funciones de fecha y hora en C) | time | 1 s (*) | (*) |
| C++ | std::time std::chrono::system_clock::now | 1 s (*) 1 ns (C++11, depende del sistema operativo) | (*) |
| C# | System.DateTime.Now System.DateTime.UtcNow | 100 ns | 1 de enero de 0001 a 31 de diciembre de 9999 |
| CICS | ASKTIME | 1 ms | 1 de enero de 1900 |
| COBOL | FUNCTION CURRENT-DATE | 1 s | 1 de enero de 1601 |
| Common Lisp | (get-universal-time) | 1 s | 1 de enero de 1900 |
| Delphi (Borland) | date time | 1 ms (punto flotante) | 1 de enero de 1900 |
| Delphi (Embarcadero Technologies) | System.SysUtils.Time | 1 ms | 0/0/0000 0:0:0:000 a 12/31/9999 23:59:59:999 |
| Delphi (Embarcadero Technologies) | System.SysUtils.GetTime (alias para System.SysUtils.Time) | 1 ms | 0/0/0000 0:0:0:000 a 12/31/9999 23:59:59:999 |
| Delphi (Embarcadero Technologies) | System.SysUtils.Date | 1 ms | 0/0/0000 0:0:0:000 a 12/31/9999 0:0:0:000 |
| Delphi (Embarcadero Technologies) | System.DateUtils.Today | 1 ms | 0/0/0000 0:0:0:000 a 12/31/9999 0:0:0:000 |
| Delphi (Embarcadero Technologies) | System.DateUtils.Tomorrow | 1 ms | 0/0/0000 0:0:0:000 a 12/31/9999 0:0:0:000 |
| Delphi (Embarcadero Technologies) | System.DateUtils.Yesterday | 1 ms | 0/0/0000 0:0:0:000 a 12/31/9999 0:0:0:000 |
| Delphi (Embarcadero Technologies) | System.SysUtils.Now | 1 s | 0/0/0000 0:0:0:000 a 12/31/9999 23:59:59:000 |
| Delphi (Embarcadero Technologies) | System.SysUtils.DayOfWeek | 1 día | 1 hasta 7 |
| Delphi (Embarcadero Technologies) | System.SysUtils.CurrentYear | 1 año | (*) |
| Emacs Lisp | (current-time) | 1 μs (*) | 1 de enero de 1970 |
| Erlang | erlang:system_time, os:system_time | Depende del sistema operativo, por ejemplo, en Linux 1ns | 1 de enero de 1970 |
| Excel | date | ? | 0 de enero de 1900 |
| Fortran | DATE_AND_TIME SYSTEM_CLOCK | (*) | 1 de enero de 1970 |
| Fortran | CPU_TIME | 1 μs | 1 de enero de 1970 |
| Go | time.Now | 1 ns | 1 de enero de 0001 |
| Haskell | Time.getClockTime | 1 ps (*) | 1 de enero de 1970 (*) |
| Haskell | Data.Time.getCurrentTime | 1 ps (*) | 17 de noviembre de 1858 (*) |
| Java | java.util.Date System.currentTimeMillis | 1 ms | 1 de enero de 1970 |
| Java | System.nanoTime | 1 ns | arbitrario |
| Java | Clock.systemUTC | 1 ns | arbitrario |
| JavaScript, TypeScript | (new Date).getTime Date.now | 1 ms | 1 de enero de 1970 |
| Matlab | now | 1 s | 0 de enero de 0000 |
| MUMPS | $H (abreviatura de $HOROLOG) | 1 s | 31 de diciembre de 1840 |
| LabVIEW | Tick Count | 1 ms | 00:00:00.000 1 de enero de 1904 |
| LabVIEW | Get Date/Time in Seconds | 1 ms | 00:00:00.000 1 de enero de 1904 |
| Objective-C | [NSDate timeIntervalSinceReferenceDate] | < 1 ms | 1 de enero de 2001 ±10,000 años |
| OCaml | Unix.time | 1 s | 1 de enero de 1970 |
| OCaml | Unix.gettimeofday | 1 μs | 1 de enero de 1970 |
| Pascal extendido | GetTimeStamp | 1 s | (*) |
| Turbo Pascal | GetTime GetDate | 10 ms | (*) |
| Perl | time | 1 s | 1 de enero de 1970 |
| Perl | Time::HiRes::time | 1 μs | 1 de enero de 1970 |
| PHP | time mktime | 1 s | 1 de enero de 1970 |
| PHP | microtime | 1 μs | 1 de enero de 1970 |
| PureBasic | Date | 1 s | 1 de enero de 1970 a 19 de enero de 2038 |
| Python | datetime.now.timestamp | 1 μs (*) | 1 de enero de 1970 |
| RPG | CURRENT(DATE), %DATE CURRENT(TIME), %TIME | 1 s | 1 de enero de 0001 a 31 de diciembre de 9999 |
| RPG | CURRENT(TIMESTAMP), %TIMESTAMP | 1 μs | 1 de enero de 0001 a 31 de diciembre de 9999 |
| Ruby | Time.now | 1 μs (*) | 1 de enero de 1970 (a el 19 de enero de 2038 antes de Ruby 1.9.2) |
| Scheme | (get-universal-time) | 1 s | 1 de enero de 1900 |
| Smalltalk | Time microsecondClock (VisualWorks) | 1 s (ANSI) 1 μs (VisualWorks) 1 s (Squeak) | 1 de enero de 1901 (*) |
| Smalltalk | Time totalSeconds (Squeak) | 1 s (ANSI) 1 μs (VisualWorks) 1 s (Squeak) | 1 de enero de 1901 (*) |
| Smalltalk | SystemClock ticksNowSinceSystemClockEpoch (Chronos) | 1 s (ANSI) 1 μs (VisualWorks) 1 s (Squeak) | 1 de enero de 1901 (*) |
| SQL | CURDATE o CURRENT DATE CURTIME o CURRENT TIME GETDATE o GETUTCDATE NOW o CURRENT TIMESTAMP SYSDATE | 3 ms | 1 de enero de 1753 a 31 de diciembre de 9999(*) |
| SQL | CURDATE o CURRENT DATE CURTIME o CURRENT TIME GETDATE o GETUTCDATE NOW o CURRENT TIMESTAMP SYSDATE | 60 s | 1 de enero de 1900 a 6 June 2079 |
| Standard ML | Time.now | 1 μs (*) | 1 de enero de 1970 (*) |
| TCL | [clock seconds] | 1 s | 1 de enero de 1970 |
| TCL | [clock milliseconds] | 1 ms | 1 de enero de 1970 |
| TCL | [clock microseconds] | 1 μs | 1 de enero de 1970 |
| TCL | [clock clicks] | 1 μs (*) | (*) |
| Windows PowerShell | Get-Date | 100 ns | 1 de enero de 0001 a 31 de diciembre de 9999 |
| Windows PowerShell | [DateTime]::Now [DateTime]::UtcNow | 100 ns | 1 de enero de 0001 a 31 de diciembre de 9999 |
| Visual Basic .NET | System.DateTime.Now System.DateTime.UtcNow | 100 ns | 1 de enero de 0001 a 31 de diciembre de 9999 |