Ir al contenido

Hora del sistema

De Wikipedia, la enciclopedia libre
Comando de fecha de Unix

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

[editar]

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

[editar]

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

[editar]

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

[editar]
20 octubre 2024 01:45:44 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

[editar]
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[1] 54.9254 ms

18.2065 Hz

Medianoche del día en curso
INT 1Ah, AH=02h[2] 1 s Medianoche del día en curso
INT 1Ah, AH=04h [3] 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: [4]
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
Función BDOS 69h> (T_GET): [5]

word, Días transcurridos desde el 1 de enero de 1978
byte, Hora (BCD)
byte, Minuto (BCD)
byte, Segundo (BCD)

DOS (Microsoft) C:\> DATE

C:\> TIME

10 ms 1 de enero de 1980 a 31 de diciembre de 2099
INT 21h, AH=2Ch SYSTEM TIME[6]
INT 21h, AH=2Ah SYSTEM DATE[7]
iOS (Apple) CFAbsoluteTimeGetCurrent() [8] < 1 ms 1 de enero de 2001 ±10.000 años
macOS CFAbsoluteTimeGetCurrent() [9] < 1 ms [10][nota 1] 1 de enero de 2001 ±10.000 años[10][nota 1]
OpenVMS SYS$GETTIM() 100 ns[11] 17 de noviembre de 1858 a 31 de julio de 31.086[12]
gettimeofday()[13] 1 μs[14] 1 de enero de 1970 a 7 de febrero de 2106[15]
clock_gettime()[16] 1 ns[14]
z/OS STCK[17] 2−12 μs

244.14 ps[17]

1 de enero de 1900 a 17 de septiembre de 2042 UT [18]
STCKE 1 de enero de 1900 a 36.765 d.C. [19]
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

gettimeofday()[13] 1 μs
clock_gettime()[16] 1 ns
OS/2 DosGetDateTime() 10 ms 1 de enero de 1980 a 31 de diciembre de 2079 [20]
Windows GetSystemTime() 1 ms 1 de enero de 1601 a 14 de septiembre de 30828, 02:48:05.4775807
GetSystemTimeAsFileTime() 100 ns
GetSystemTimePreciseAsFileTime()

Lenguajes y aplicaciones de programación

[editar]
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 (*)[nota 2] (*)[nota 2]
C++ std::time()

std::chrono::system_clock::now()

1 s (*)[nota 2]
1 ns

(C++11, depende del sistema operativo)

(*)[nota 2]
C# System.DateTime.Now[21]

System.DateTime.UtcNow[22]

100 ns[23] 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)[24]
System.SysUtils.Time[25] 1 ms 0/0/0000 0:0:0:000 a
12/31/9999 23:59:59:999
System.SysUtils.GetTime[26]​ (alias para System.SysUtils.Time)
System.SysUtils.Date[27] 0/0/0000 0:0:0:000 a
12/31/9999 0:0:0:000
System.DateUtils.Today[28]
System.DateUtils.Tomorrow[29]
System.DateUtils.Yesterday[30]
System.SysUtils.Now[31] 1 s 0/0/0000 0:0:0:000 a
12/31/9999 23:59:59:000
System.SysUtils.DayOfWeek[32] 1 día 1 hasta 7
System.SysUtils.CurrentYear[33] 1 año (*)
Emacs Lisp (current-time) 1 μs (*) 1 de enero de 1970
Erlang erlang:system_time(),[34]​ os:system_time()[35][36] Depende del sistema operativo, por ejemplo, en Linux 1ns[36] 1 de enero de 1970[36]
Excel date() ? 0 de enero de 1900[37]
Fortran DATE_AND_TIME
SYSTEM_CLOCK
(*)[38][39] 1 de enero de 1970
CPU_TIME 1 μs
Go time.Now() 1 ns 1 de enero de 0001
Haskell Time.getClockTime 1 ps (*) 1 de enero de 1970 (*)
Data.Time.getCurrentTime 1 ps (*) 17 de noviembre de 1858 (*)
Java java.util.Date()
System.currentTimeMillis()
1 ms 1 de enero de 1970
System.nanoTime()[40] 1 ns arbitrario[40]
Clock.systemUTC()[41] 1 ns arbitrario[42]
JavaScript, TypeScript (new Date()).getTime()
Date.now()
1 ms 1 de enero de 1970
Matlab now 1 s 0 de enero de 0000[43]
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
Get Date/Time in Seconds 1 ms 00:00:00.000 1 de enero de 1904
Objective-C [NSDate timeIntervalSinceReferenceDate] < 1 ms[44] 1 de enero de 2001 ±10,000 años[44]
OCaml Unix.time() 1 s 1 de enero de 1970
Unix.gettimeofday() 1 μs
Pascal extendido GetTimeStamp() 1 s (*)
Turbo Pascal GetTime()
GetDate()
10 ms (*)
Perl time() 1 s 1 de enero de 1970
Time::HiRes::time[45] 1 μs
PHP time()
mktime()
1 s 1 de enero de 1970
microtime() 1 μs
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
CURRENT(TIMESTAMP), %TIMESTAMP 1 μs
Ruby Time.now()[46] 1 μs (*) 1 de enero de 1970
(a el 19 de enero de 2038 antes de Ruby 1.9.2[47]​)
Scheme (get-universal-time)[48] 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 (*)
Time totalSeconds
(Squeak)
SystemClock ticksNowSinceSystemClockEpoch
(Chronos)
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(*)
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
[clock milliseconds] 1 ms
[clock microseconds] 1 μs
[clock clicks] 1 μs (*) (*)
Windows PowerShell Get-Date[49][50] 100 ns[23] 1 de enero de 0001 a 31 de diciembre de 9999
[DateTime]::Now[21]
[DateTime]::UtcNow[22]
Visual Basic .NET System.DateTime.Now[21]
System.DateTime.UtcNow[22]
100 ns[23] 1 de enero de 0001 a 31 de diciembre de 9999

Véase también

[editar]

Notas

[editar]
  1. a b La documentación para desarrolladores de Apple no es clara en cuanto a la precisión y el rango de CFAbsoluteTime/CFTimeInterval, excepto en la documentación CFRunLoopTimerCreate, que hace referencia a una precisión de "submilisegundos como máximo". Sin embargo, el tipo similar NSTimeInterval parece ser intercambiable y tiene la precisión y el rango enumerados.
  2. a b c d La biblioteca estándar de C no indica ninguna resolución específica, época, rango o tipo de datos para los valores de la hora del sistema. La biblioteca C++ engloba la biblioteca C, por lo que utiliza la misma implementación de hora del sistema que C.

Referencias

[editar]
  1. Brown, Ralf D. (2000). «Int 0x1A, AH=0x00». Ralf Brown's Interrupt List (en inglés). 
  2. Brown, Ralf D. (2000). «Int 0x1A, AH=0x02». Ralf Brown's Interrupt List (en inglés). 
  3. Brown, Ralf D. (2000). «Int 0x1A, AH=0x04». Ralf Brown's Interrupt List (en inglés). 
  4. «CP/M Plus (CP/M Version 3.0) Operating System Guide» (en inglés). 
  5. «BDOS system calls» (en inglés). 
  6. Brown, Ralf D. (2000). «Int 0x21, AH=0x2c». Ralf Brown's Interrupt List (en inglés). 
  7. Brown, Ralf D. (2000). «Int 0x21, AH=0x2a». Ralf Brown's Interrupt List (en inglés). 
  8. «Time Utilities Reference». iOS Developer Library (en inglés). 2007. 
  9. «Time Utilities Reference». Mac OS X Developer Library (en inglés). 2007. 
  10. a b «Time Utilities - Foundation». Apple Developer Documentation (en inglés). Consultado el 6 de julio de 2022. 
  11. Goldenberg, Ruth E.; Kenah, Lawrence J.; Dumas, Denise E. (1991). VAX/VMS Internals and Data Structures, Version 5.2 (en inglés). Digital Press. ISBN 978-1555580599. 
  12. «Why is Wednesday, November 17, 1858 the base time for OpenVMS (VAX VMS)?». Stanford University (en inglés). 24 de julio de 1997. Archivado desde el original el 24 de julio de 1997. Consultado el 8 de enero de 2020. 
  13. a b «gettimeofday - get the date and time» (en inglés). 
  14. a b «VSI C Run-Time Library Reference Manual for OpenVMS Systems» (en inglés). VSI. Noviembre de 2020. Consultado el 17 de abril de 2021. 
  15. «OpenVMS and the year 2038» (en inglés). HP. Consultado el 17 de abril de 2021. 
  16. a b «clock_getres, clock_gettime, clock_settime - clock and timer functions» (en inglés). 
  17. a b z/Architecture Principles of Operation (en inglés). Poughkeepsie (Nueva York): International Business Machines. 2007. pp. 7-187. 
  18. IBM tiene la intención de ampliar el intervalo de fechas en futuros sistemas más allá de 2042. «z/Architecture Principles of Operation». International Business Machines (en inglés) (Poughkeepsie (Nueva York)): 1-47. 2007. 
  19. «Expanded 64-bit time values». IBM (en inglés). Consultado el 18 de abril de 2021. 
  20. de Boyne Pollard, Jonathan. «The 32-bit Command Interpreter» (en inglés). «En OS/2 Warp 4, tanto la fecha como la hora pueden funcionar mucho más allá del año 2000 e incluso mucho más allá del año 2038 y de hecho, hasta el año 2079, que es el límite para el reloj en tiempo real de OS/2 Warp 4». 
  21. a b c «DateTime.Now Property». Microsoft Docs (en inglés). 
  22. a b c «DateTime.UtcNow Property». Microsoft Docs (en inglés). 
  23. a b c «DateTime.Ticks Property». Microsoft Docs (en inglés). 
  24. «Date and Time Support». Embarcadero Developer Network (en inglés). 2013. 
  25. «System.SysUtils.Time». Embarcadero Developer Network (en inglés). 2013. 
  26. «System.SysUtils.GetTime». Embarcadero Developer Network (en inglés). 2013. 
  27. «System.SysUtils.Date». Embarcadero Developer Network' (en inglés). 2013. 
  28. «System.DateUtils.Today». Embarcadero Developer Network (en inglés). 2013. 
  29. «System.DateUtils.Tomorrow». Embarcadero Developer Network (en inglés). 2013. 
  30. «System.DateUtils.Yesterday». Embarcadero Developer Network (en inglés). 2013. 
  31. «System.SysUtils.Now». Embarcadero Developer Network (en inglés). 2013. 
  32. «System.SysUtils.DayOfWeek». Embarcadero Developer Network (en inglés). 2013. 
  33. «System.SysUtils.CurrentYear». Embarcadero Developer Network (en inglés). 2013. 
  34. «erlang» (en inglés). 
  35. «os» (en inglés). 
  36. a b c «Time and Time Correction in Erlang». www.erlang.org (en inglés). 
  37. «XL2000: Early Dates on Office Spreadsheet Component Differ from Excel». Microsoft Support (en inglés). 2003. Archivado desde el original el 24 de octubre de 2007. «En Microsoft Office Spreadsheet Component, el valor 0 se evalúa a la fecha 30 de diciembre de 1899 y el valor 1 se evalúa al 31 de diciembre de 1899. En Excel, el valor 0 equivale al 0 de enero de 1900 y el valor 1 equivale al 1 de enero de 1900.» 
  38. «SYSTEM_CLOCK». Intel Fortran Compiler 19.0 Developer Guide and Reference (en inglés). 29 de abril de 2019. Consultado el 23 de julio de 2019. 
  39. «SYSTEM_CLOCK — Time function». The GNU Fortran Compiler (en inglés). Consultado el 27 de octubre de 2011. 
  40. a b «System.nanoTime() method». Java Platform, Standard Edition 6: API Specification (en inglés). 2015. Consultado el 23 de julio de 2019. 
  41. «Clock.systemUTC() and other methods». Java Platform, Standard Edition 8: API Specification (en inglés). 2014. Consultado el 15 de enero de 2015. 
  42. «JSR-310 Java Time System». Java Platform, Standard Edition 8: API Specification (en inglés). 2014. Consultado el 15 de enero de 2015. 
  43. «Matlab Help» (en inglés). 
  44. a b «NSTimeInterval - Foundation». Apple Developer Documentation (en inglés). 
  45. Douglas Wegscheild, R. Schertler, and Jarkko Hietaniemi, Wegscheild, Douglas (2011). «Time::HiRes». CPAN - Comprehensive Perl Archive Network (en inglés). Consultado el 27 de octubre de 2011. 
  46. Neurogami, James Britt. «Time class». Ruby-Doc.org: Help and documentation for the Ruby programming language (en inglés). Scottsdale (Arizona). Consultado el 27 de octubre de 2011. 
  47. «Ruby 1.9.2 is released» (en inglés). 18 de agosto de 2010. «La nueva 1.9.2 es casi compatible con la 1.9.1, excepto por estos cambios: Se reimplementa el tiempo. Se corrige el error con el año 2038.» 
  48. «MIT/GNU Scheme 9.2: 15.5 Date and Time» (en inglés). 
  49. «Using the Get-Date Cmdlet». Microsoft Docs (en inglés). Consultado el 23 de julio de 2019. 
  50. «Windows PowerShell Tip of the Week – Formatting Dates and Times». Microsoft Docs (en inglés). Consultado el 23 de julio de 2019. 

Enlaces externos

[editar]