# Hora do sistema

Na ciência da computação e programação de computadores, hora do sistema representa a noção da passagem de tempo de um computador. Nesse sentido, hora também inclui a contagem de dias no calendário.
A hora do sistema é marcada por um relógio do sistema, que é tipicamente implementado como um contador simples do número de ticks que transpiram desde uma data inicial, chamada era. Por exemplo, Sistemas em conformidade com Unix e POSIX codificam a hora do sistema ("Hora Unix") como o número de segundos passados desde o início da era Unix marcada em 1 de janeiro de 1970 às 00:00:00 UTC, excluindo segundos intercalados. Sistemas que implementam as versões de 32-bit e 64-bit da API do Windows, como o Windows 9x e Windows NT, fornecem a hora do sistema como SYSTEMTIME, representado como um valor de ano/mês/dia/hora/minuto/milissegundo e FILETIME representado como um contador dos ticks de 100 nanosegundos passados desde 1 de janeiro de 1601 às 00:00:00 UTC como constatado no calendário gregoriano proléptico.
A hora do sistema pode ser convertida em uma data, que é uma forma mais adequada à compreensão humana. Por exemplo, a hora do sistema Unix 1000000000 segundos desde o inicio da era é traduzida para a data 9 de setembro de 2001 às 01:46:40 UT. Bibliotecas de sub-rotinas que cuidam de tais conversões também podem lidar com os ajustes de fuso horário, horário de verão, segundos intercalados e as configurações de locale do usuário. Bibliotecas de rotinas, geralmente, também fornecem a conversão de datas para hora do sistema.

## Outras medidas de tempo

Também é relacionado à hora do sistema o tempo de processo, que é um contador do tempo da CPU consumido pela execução de um processo, pode ser dividido entre tempo da CPU do usuário e do sistema, representando o tempo gasto executando códigos do usuário e códigos do núcleo do sistema, respectivamente. tempos de processo são uma contagem de instruções da CPU ou ciclos do relógio e geralmente não estão relacionadas diretamente ao tempo realmente decorrido.
Sistemas de arquivos mantém registro da hora que arquivos são criados, modificados e/ou acessados armazenando marcas temporais no bloco de controle de arquivos (ou Nó-i) de cada arquivo e diretório.

## História

A maioria dos computadores pessoais de primeira geração não marcavam a data e hora. Incluindo sistemas que rodavam o sistema operacional CP/M, também com os primeiros modelos do Apple II, o BBC Micro e o Commodore PET, entre outros. Periféricos que incluíam chips de relógios de tempo real com baterias de backup embutidas estavam disponíveis para o IBM PC e XT, mas o IBM AT foi o primeiro PC de ampla disponibilidade que já vinha equipado com hardware de data/hora embutido na placa-mãe. Antes da disponibilidade geral das redes de computadores, a maioria dos sistemas de computadores pessoais que marcavam a hora do sistema, só marcavam o tempo local e não levavam em conta fuso horários diferentes.
Com a tecnologia atual, a maioria dos computadores modernos marcam o tempo local, assim como muitos outros dispositivos pessoais e domésticos como: Videocassete, DVRs, codificadores de TV a cabo, assistentes digitais, pagers, celulares, máquinas de fax, secretárias eletrônicas, cameras, camcorders, aparelhos de ar condicionado e fornos de micro-ondas.
Microcontroladores que operam em sistemas embutidos (como o Raspberry Pi, Arduino e outros sistemas similares) nem sempre tem hardware interno para marcar o tempo. Muitos destes sistemas de controle operam sem saber o tempo externo. Aqueles que precisam de tal informação geralmente iniciam sua base de tempo ao reinicializar, obtendo a hora atual de uma fonte externa como: um servidor de horário, relógio externo ou pedindo ao usuário que insira a hora atual manualmente.

## Implementação

O relógio do sistema é normalmente implementado como um temporizador de intervalo programável que periodicamente interrompe a CPU, que então executa uma rotina de serviço de interrupção de temporizador. Essa rotina geralmente adiciona um tick ao relógio do sistema (um contador simples) e cuida de outras tarefas de manutenção periódicas (Preemptividade, etc.) antes de retornar à tarefa que a CPU estava executando antes da interrupção.

## Consultando a hora do sistema

As tabelas a seguir mostram métodos de acessar a hora do sistema em diversos sistemas operacionais, linguagens de programação e aplicações. Valores marcados por (*) dependem do sistema e podem diferir entre implementações. Todas as datas estão marcadas como se no calendário gregoriano ou no calendário gregoriano proléptico.
Note que a resolução de uma implementação de medida de tempo não implica a mesma precisão de tal medida. Por exemplo, um sistema pode retornar a hora atual como um valor em microssegundos, mas na realidade ser capaz de discernir ticks individuais de relógio com uma frequência de apenas 100 Hz (10 ms).

### Sistemas operacionais

| Sistema operacional | Comando ou função | Resolução | Era ou faixa |
| Android | java.lang.System.currentTimeMillis | 1 ms | 1 de janeiro de 1970 |
| BIOS (IBM PC) | INT 1Ah, AH=00h | 54,9254 ms 18,2065 Hz | Meia-noite do dia atual |
| BIOS (IBM PC) | INT 1Ah, AH=02h | 1 s | Meia-noite do dia atual |
| BIOS (IBM PC) | INT 1Ah, AH=04h | 1 dia | 1 de janeiro de 1980 ou 31 de dezembro de 1999 (depende do sistema) |
| CP/M Plus | System Control Block: scb$base+58h, Days since 31 December 1977 scb$base+5Ah, Hour (BCD) scb$base+5Bh, Minute (BCD) scb$base+5Ch, Second (BCD) | 1 s | 31 de dezembro de 1977 até 5 de junho de 2157 |
| CP/M Plus | BDOS function 69h> (T_GET): word, Days since 1 January 1978 byte, Hour (BCD) byte, Minute (BCD) byte, Second (BCD) | 1 s | 31 de dezembro de 1977 até 5 de junho de 2157 |
| DOS (Microsoft) | C:\>DATE C:\>TIME | 10 ms | 1 de janeiro de 1980 até 31 de dezembro de 2099 |
| DOS (Microsoft) | INT 21h, AH=2Ch SYSTEM TIME INT 21h, AH=2Ah SYSTEM DATE | 10 ms | 1 de janeiro de 1980 até 31 de dezembro de 2099 |
| iOS (Apple) | CFAbsoluteTimeGetCurrent | < 1 ms | 1 de janeiro de 2001 ±10.000 anos |
| macOS | CFAbsoluteTimeGetCurrent | < 1 ms | 1 de janeiro de 2001 ±10.000 anos |
| OpenVMS | SYS$GETTIM | 100 ns | 17 de novembro de 858 até 31 de julho de 31.086 |
| OpenVMS | gettimeofday | 1 μs | 1 de janeiro de 1970 até 7 de fevereiro de 2106 |
| OpenVMS | clock_gettime | 1 ns | 1 de janeiro de 1970 até 7 de fevereiro de 2106 |
| z/OS | STCK$^{:7–187}$ | 2$^{−12}$ μs 244,14 ps$^{:4-45,4-46}$ | 1 de janeiro de 1900 até 17 de setembro de 2042 UTC |
| z/OS | STCKE | 2$^{−12}$ μs 244,14 ps$^{:4-45,4-46}$ | 1 de janeiro de 1900 até 36.765 d.C. |
| Unix, POSIX (ver tambémtime.h) | $date time | 1 s | (*) 1 de janeiro de 1970 (até 19 de janeiro de 2038 antes do Linux 5.9) até 2 de julho de 2486 (após o Linux 5.10) 1 de janeiro de 1970 até 4 de dezembro de 292.277.026.596 d.C. |
| Unix, POSIX (ver tambémtime.h) | gettimeofday | 1 μs | (*) 1 de janeiro de 1970 (até 19 de janeiro de 2038 antes do Linux 5.9) até 2 de julho de 2486 (após o Linux 5.10) 1 de janeiro de 1970 até 4 de dezembro de 292.277.026.596 d.C. |
| Unix, POSIX (ver tambémtime.h) | clock_gettime | 1 ns | (*) 1 de janeiro de 1970 (até 19 de janeiro de 2038 antes do Linux 5.9) até 2 de julho de 2486 (após o Linux 5.10) 1 de janeiro de 1970 até 4 de dezembro de 292.277.026.596 d.C. |
| OS/2 | DosGetDateTime | 10 ms | 1 de janeiro de 1980 até 31 de dezembro de 2079 |
| Windows | GetSystemTime | 1 ms | 1 de janeiro de 1601 até 14 de setembro de 30.828, às 02:48:05,4775807 |
| Windows | GetSystemTimeAsFileTime | 100 ns | 1 de janeiro de 1601 até 14 de setembro de 30.828, às 02:48:05,4775807 |
| Windows | GetSystemTimePreciseAsFileTime | 100 ns | 1 de janeiro de 1601 até 14 de setembro de 30.828, às 02:48:05,4775807 |

### Linguagens de programação e aplicações

| Linguagem/Aplicação | Função ou variável | Resolução | Era ou faixa |
| Ada | Ada.Calendar.Clock | 100 μs até 20 ms (*) | 1 de janeiro de 1901 até 31 de dezembro 2099 (*) |
| AWK | systime | 1 s | (*) |
| BASIC, True BASIC | DATE, DATE$ TIME, TIME$ | 1 s | (*) |
| Business BASIC | DAY, TIM | 0.1 s | (*) |
| C (ver funções de data e hora em C) | time | 1 s (*) | (*) |
| C++ | std::time std::chrono::system_clock::now | 1 s (*) 1 ns (C++11, Depende do SO) | (*) |
| C# | System.DateTime.Now System.DateTime.UtcNow | 100 ns | 1 de janeiro de 0001 até 31 de dezembro de 9999 |
| CICS | ASKTIME | 1 ms | 1 de janeiro de 1900 |
| COBOL | FUNCTION CURRENT-DATE | 1 s | 1 de janeiro de 1601 |
| Common Lisp | (get-universal-time) | 1 s | 1 de janeiro de 1900 |
| Delphi (Borland) | date time | 1 ms (floating point) | 1 de janeiro de 1900 |
| Delphi (Embarcadero Technologies) | System.SysUtils.Time | 1 ms | 0/0/0000 0:0:0:000 até 31/12/9999 às 23:59:59:999 [sic] |
| Delphi (Embarcadero Technologies) | System.SysUtils.GetTime (alias for System.SysUtils.Time) | 1 ms | 0/0/0000 0:0:0:000 até 31/12/9999 às 23:59:59:999 [sic] |
| Delphi (Embarcadero Technologies) | System.SysUtils.Date | 1 ms | 0/0/0000 0:0:0:000 até 31/12/9999, às 0:0:0:000 [sic] |
| Delphi (Embarcadero Technologies) | System.DateUtils.Today | 1 ms | 0/0/0000 0:0:0:000 até 31/12/9999, às 0:0:0:000 [sic] |
| Delphi (Embarcadero Technologies) | System.DateUtils.Tomorrow | 1 ms | 0/0/0000 0:0:0:000 até 31/12/9999, às 0:0:0:000 [sic] |
| Delphi (Embarcadero Technologies) | System.DateUtils.Yesterday | 1 ms | 0/0/0000 0:0:0:000 até 31/12/9999, às 0:0:0:000 [sic] |
| Delphi (Embarcadero Technologies) | System.SysUtils.Now | 1 s | 0/0/0000 0:0:0:000 até 31/12/9999, às 23:59:59:000 [sic] |
| Delphi (Embarcadero Technologies) | System.SysUtils.DayOfWeek | 1 day | 1 à 7 |
| Delphi (Embarcadero Technologies) | System.SysUtils.CurrentYear | 1 year | (*) |
| Emacs Lisp | (current-time) | 1 μs (*) | 1 de janeiro de 1970 |
| Erlang | erlang:system_time, os:system_time | Depende do SO, Linux, por exemplo: 1ns | 1 de janeiro de 1970 |
| Excel | date | ? | 0 de janeiro de 1900 |
| Fortran | DATE_AND_TIME SYSTEM_CLOCK | (*) | 1 de janeiro de 1970 |
| Fortran | CPU_TIME | 1 μs | 1 de janeiro de 1970 |
| Go | time.Now | 1 ns | 1 de janeiro de 0001 |
| Haskell | Time.getClockTime | 1 ps (*) | 1 de janeiro de 1970 (*) |
| Haskell | Data.Time.getCurrentTime | 1 ps (*) | 17 de novembro de 1858 (*) |
| Java | java.util.Date System.currentTimeMillis | 1 ms | 1 de janeiro de 1970 |
| Java | System.nanoTime | 1 ns | arbitrário |
| Java | Clock.systemUTC | 1 ns | arbitrário |
| JavaScript, TypeScript | (new Date).getTime Date.now | 1 ms | 1 de janeiro de 1970 |
| Matlab | now | 1 s | 0 de janeiro de 0000 |
| MUMPS | $H (abreviação de $HOROLOG) | 1 s | 31 de dezembro de 1840 |
| LabVIEW | Tick Count | 1 ms | 00:00:00.000 1 de janeiro de 1904 |
| LabVIEW | Get Date/Time in Seconds | 1 ms | 00:00:00.000 1 de janeiro de 1904 |
| Objective-C | [NSDate timeIntervalSinceReferenceDate] | < 1 ms | 1 de janeiro de 2001 ±10.000 anos |
| OCaml | Unix.time | 1 s | 1 de janeiro de 1970 |
| OCaml | Unix.gettimeofday | 1 μs | 1 de janeiro de 1970 |
| Extended Pascal | GetTimeStamp | 1 s | (*) |
| Turbo Pascal | GetTime GetDate | 10 ms | (*) |
| Perl | time | 1 s | 1 de janeiro de 1970 |
| Perl | Time::HiRes::time | 1 μs | 1 de janeiro de 1970 |
| PHP | time mktime | 1 s | 1 de janeiro de 1970 |
| PHP | microtime | 1 μs | 1 de janeiro de 1970 |
| PureBasic | Date | 1 s | 1 de janeiro de 1970 até 19 de janeiro de 2038 |
| Python | datetime.now.timestamp | 1 μs (*) | 1 de janeiro de 1970 |
| RPG | CURRENT(DATE), %DATE CURRENT(TIME), %TIME | 1 s | 1 de janeiro de 0001 até 31 de dezembro de 9999 |
| RPG | CURRENT(TIMESTAMP), %TIMESTAMP | 1 μs | 1 de janeiro de 0001 até 31 de dezembro de 9999 |
| Ruby | Time.now | 1 μs (*) | 1 de janeiro de 1970 (até 19 de janeiro de 2038 antes do Ruby 1.9.2) |
| Smalltalk | Time microsecondClock (VisualWorks) | 1 s (ANSI) 1 μs (VisualWorks) 1 s (Squeak) | 1 de janeiro de 1901 (*) |
| Smalltalk | Time totalSeconds (Squeak) | 1 s (ANSI) 1 μs (VisualWorks) 1 s (Squeak) | 1 de janeiro de 1901 (*) |
| Smalltalk | SystemClock ticksNowSinceSystemClockEpoch (Chronos) | 1 s (ANSI) 1 μs (VisualWorks) 1 s (Squeak) | 1 de janeiro de 1901 (*) |
| SQL | CURDATE or CURRENT DATE CURTIME or CURRENT TIME GETDATE NOW or CURRENT TIMESTAMP SYSDATE | 3 ms | 1 de janeiro de 1753 até 31 de dezembro de 9999 (*) |
| SQL | CURDATE or CURRENT DATE CURTIME or CURRENT TIME GETDATE NOW or CURRENT TIMESTAMP SYSDATE | 60 s | 1 de janeiro de 1900 até 6 de junho de 2079 |
| Standard ML | Time.now | 1 μs (*) | 1 de janeiro de 1970 (*) |
| TCL | [clock seconds] | 1 s | 1 de janeiro de1970 |
| TCL | [clock milliseconds] | 1 ms | 1 de janeiro de1970 |
| TCL | [clock microseconds] | 1 μs | 1 de janeiro de1970 |
| TCL | [clock clicks] | 1 μs (*) | (*) |
| Windows PowerShell | Get-Date | 100 ns | 1 de janeiro de 0001 até 31 de dezembro de 9999 |
| Windows PowerShell | [DateTime]::Now [DateTime]::UtcNow | 100 ns | 1 de janeiro de 0001 até 31 de dezembro de 9999 |
| Visual Basic .NET | System.DateTime.Now System.DateTime.UtcNow | 100 ns | 1 de janeiro de 0001 até 31 de dezembro de 9999 |