O tempo Unix ou tempo Posix (também chamado de carimbo de data / hora Unix ) é uma medida de tempo baseada no número de segundos desde1 ° de janeiro de 197000:00:00 UTC , excluindo os segundos bissextos . É usado principalmente em sistemas que estão em conformidade com o padrão POSIX , incluindo sistemas do tipo Unix , daí seu nome. É a representação POSIX do tempo.
Para associar um evento a um número real, basta usar referências naturais e universais: por exemplo, as periodicidades de rotação da Terra sobre si mesma e em torno do Sol. Esses períodos são suficientes para estabelecer calendários , ou seja, relações entre eventos e datas, mesmo que seja necessário algum esforço para definir claramente as referências utilizadas (cada país tem o seu, todos adotados em momentos diferentes); as datas desses calendários são apenas números expressos em um sistema de numeração um tanto complicado que tem as unidades de dia, semana, mês, estação, ano, etc., e a hora Posix não é mais do que uma referência expressa como um número simples.
Principais sistemas de medição usadosAqui estão os principais sistemas de medição de tempo que foram imaginados e usados até hoje:
Acrônimo | Significado | Definição |
---|---|---|
GMT | Horário de Greenwich | Ainda em uso em alguns países por aspectos legais.
No entanto, a definição deste sistema de medição é ambígua. Por isso, além desse uso administrativo, é preferível usar o UTC. |
Ut | Tempo universal | Este sistema define o dia como a duração média da rotação da Terra em torno de seu eixo.
Esta definição apresenta algumas dificuldades porque a velocidade desta rotação não é constante, diminui lentamente sob o efeito das marés e, além disso, apresenta irregularidades imprevisíveis: a duração dos dias UT é ligeiramente superior, em média, a 86.400 segundos ( número de segundos em 24 horas). A diferença é da ordem de um segundo em um a três anos. Existem várias versões de UT: UT0, UT1, UT1R, UT2. Consulte o artigo “Horário universal ” para obter mais detalhes. |
TAI | Hora atômica internacional | Este sistema é baseado em uma definição internacional do segundo. Seu padrão consiste em vários relógios atômicos distribuídos ao redor do mundo. A medição do tempo neste sistema é estritamente regular ao contrário do anterior para o qual o seu padrão não tem a mesma regularidade. Como resultado, TAI e UT se afastam gradualmente um do outro devido à desaceleração do segundo.
|
UTC | Tempo universal coordenado |
Este sistema é adotado como base do tempo civil internacional por um grande número de países. A palavra "coordenado" indica que:
Em outras palavras, o UTC é idêntico ao TAI (tem sua estabilidade e precisão) até um número inteiro de segundos, o que permite que ele se mantenha no UT com a aproximação de 0,9 s ; isso é o que mostra a figura ao lado.
|
Para medir o tempo, você deve escolher uma origem:
É necessário indicar como esse número evolui com o passar do tempo:
# | TAI | UTC | TAI - UTC | Tempo Posix | |
---|---|---|---|---|---|
1 | 01-01-2009T00: 00: 30 | 31-12-2008T23: 59: 57 | 33 | 1.230.767.997 | |
2 | 01-01-2009T00: 00: 31 | 31-12-2008T23: 59: 58 | 33 | 1.230.767.998 | |
3 | 01-01-2009T00: 00: 32 | 31-12-2008T23: 59: 59 | 33 | 1.230.767.999 | |
4 | 01-01-2009T00: 00: 33 | 31-12-2008T23: 59: 60 | 33 | 1.230.768.000 | adição de um segundo bissexto |
5 | 01-01-2009T00: 00: 34 | 01-01-2009T00: 00: 00 | 34 | 1.230.768.000 | |
6 | 01-01-2009T00: 00: 35 | 01-01-2009T00: 00: 01 | 34 | 1.230.768.001 | |
7 | 01-01-2009T00: 00: 36 | 01-01-2009T00: 00: 02 | 34 | 1.230.768.002 |
O Posix Time não é uma representação linear do tempo, existem anomalias, como a linha 5 da tabela acima.
Sem correspondência do bijetivo entre o horário UTC e o horário Posix; o último não permite representar os segundos intercalados presentes em UTC, como a linha 4 da tabela acima: 2008-12-31T23: 59: 60 UTC.
Essas diferentes referências não devem ser misturadas (por exemplo, o ano zero de um calendário não começa ao mesmo tempo que o de outro) e também porque todos esses calendários precisam se adaptar a periodicidades não múltiplas entre si, por exemplo, salto anos, ou as irregularidades dessas periodicidades. Essas adaptações complicam um pouco os cálculos, dependendo da precisão que você está procurando; por exemplo, um ano decorrido pode ser informação suficiente ou será necessário levar em consideração o caráter bissexto do ano para responder à mesma pergunta expressa em número de dias. Isso significa que você deve manter uma memória do passado, a memória de cada segundo que passa.
Na maioria dos casos, uma diferença simples nos tempos Posix é suficiente, a menos que os dois eventos ocupem um ou mais segundos bissextos. Para calcular um atraso exato em todas as circunstâncias, você deve levar em consideração os segundos bissextos.
No entanto, a ocorrência de segundos intercalados é baixa, então a probabilidade de cometer tal erro é baixa; e se, apesar de tudo, o caso ocorrer, então a magnitude do erro pode ser pequena e não há necessidade de se preocupar com esses segundos bissextos neste caso; a tabela abaixo mostra diferentes exemplos.
O método para completar uma linha desta tabela é o seguinte:
A aplicação deste método para os tempos M = 10, 100, 1000 dá a seguinte tabela:
Tempo para medir (M) | Probabilidade de erro | Magnitude do erro |
---|---|---|
10 s | 3,2 × 10 -7 | 10% |
100 s | 3,2 × 10 -6 | 1% |
1000 s | 3,2 × 10 -5 | 0,1% |
Em última análise, se o tempo para calcular entre os dois eventos de interesse for de um ano, a probabilidade de cometer um erro de 3,2 × 10 -8 é de 100% .
A probabilidade de cometer um determinado erro e a magnitude desse erro variam inversamente entre si; outra maneira de colocar isso seria dizer:
Se este par (probabilidade de cometer um erro / magnitude do erro) é inaceitável, ou se não sabemos como avaliar o impacto, então é certamente necessário perguntar por que usamos UTC e qual é a necessidade de a precisão necessária, ou para permitir o uso de tabelas a serem atualizadas assim que for programada a inserção / retirada de um segundo bissexto .
Convertendo UTC em Posix TimeAlém das raras anomalias mencionadas acima com relação aos segundos bissextos, é fácil converter uma hora UTC em uma hora Posix e vice-versa.
Exemplo: qual é a hora Posix no início do dia de 1 ° de janeiro de 2009(linha 5 da Tabela 1 acima):
Número de dias decorridos | ||||
---|---|---|---|---|
1.970 | 1.971 | 1.972 | 1.973 | 3 * 365 + 366 = 1461 |
1.974 | 1.975 | 1.976 | 1.977 | 1461 |
1.978 | 1.979 | 1.980 | Mil novecentos e oitenta e um | 1461 |
1 982 | 1 983 | 1 984 | 1 985 | 1461 |
1.986 | 1.987 | 1.988 | 1 989 | 1461 |
1990 | 1.991 | 1.992 | 1.993 | 1461 |
1 994 | 1.995 | 1.996 | 1997 | 1461 |
1.998 | 1.999 | 2.000 | 2.001 | 1461 |
2.002 | 2.003 | 2004 | 2.005 | 1461 |
2.006 | 2.007 | 2.008 | 2 * 365 + 366 = 1096 | |
14 245 |
Existem também ferramentas que realizam esses cálculos de forma muito simples, como este "script de shell" para converter alguns segundos desde a era Posix em uma data:
#!/bin/sh # convertir un nombre de secondes depuis l'époque Posix # en date # exemple: date -u -R --date "1970-01-01 1230768000 seconds" date -u -R --date "1970-01-01 $* seconds" Conversão de um horário Posix em horário UTCO cálculo reverso não apresenta nenhuma dificuldade e, da mesma forma, existem ferramentas que realizam esses cálculos de forma muito simples, como este script bash para converter uma data em um número de segundos desde a época Posix:
#!/bin/sh # convertir une date (attention au format de l'argument) # en nombre de secondes depuis l'époque Posix # exemple: date --date "2009-01-01 00:00:00+00:00" "+%s" date --date "$*" "+%s"O método mais comum para ler a hora no Unix é a chamada à seguinte função que retorna um valor numérico do tipo " time_t".
time_t time(NULL);Este tipo time_t é comumente usado para manipular o tempo UNIX, infelizmente o padrão POSIX não especifica (claramente) seu tamanho:
Hora Unix | UTC | |
---|---|---|
data mais antiga: -2 31 | -2 147 483 648 | 13/12/1901 T 20:45:52 |
Era Unix: 0 | 0 | 01/01/1970 T 00:00:00 |
data mais antiga: 2 31 -1 | 2.147.483.647 | 2038-01-19 T 03:14:07 |
Esta impossibilidade de representação não põe necessariamente em causa o funcionamento da própria máquina, ou seja, o funcionamento do seu sistema operativo, mas sim o funcionamento das suas aplicações e a sua interoperabilidade com outras máquinas. Com efeito, não basta uma máquina saber gerir localmente este limite, mas também é necessário que todas as máquinas a ela ligadas possam gerir este limite e isto da mesma forma.
Vários casos podem surgir:
Os sistemas Unix geralmente mantêm um contador cuja resolução é mais precisa do que o segundo. Este tempo pode ser acessado chamando a seguinte função:
int gettimeofday(struct timeval *tv, NULL);O valor numérico retornado por esta função é armazenado na variável “ struct timeval *tv ” definida como segue:
struct timeval { int tv_sec; /* secondes */ int tv_usec; /* microsecondes de 0 à 999999 */ };Usar essa resolução de sub-segundo levanta a questão do que acontece quando um segundo bissexto é adicionado ou subtraído? Parece que este ponto é de responsabilidade do sistema operacional. Na ausência de uma especificação clara, vários cenários são possíveis, dependendo do sistema operacional considerado. Os três exemplos abaixo mostram as três categorias de casos que parecem mais representativos, eles lidam apenas com o aspecto de inserção de um segundo bissexto, mas eles poderiam ser facilmente adaptados para o caso de exclusão:
# | UTC | tv_sec | tv_usec | |
---|---|---|---|---|
4 | 31-12-2008T23: 59: 60.000 | 1.230.768.000 | 0 | |
31-12-2008T23: 59: 60.500 | 1.230.768.000 | 500.000 | ||
5 | 01-01-2009T00: 00: 00.000 | 1.230.768.000 | 0 | tempo de repente ajustado |
01-01-2009T00: 00: 00.500 | 1.230.768.000 | 500.000 | ||
6 | 01-01-2009T00: 00: 01.000 | 1.230.768.001 | 0 |
# | UTC | tv_sec | tv_usec | |
---|---|---|---|---|
4 | 31-12-2008T23: 59: 60.000 | 1.230.768.000 | 0 | |
31-12-2008T23: 59: 60.500 | 1.230.768.000 | 0 | hora congelada | |
5 | 01-01-2009T00: 00: 00.000 | 1.230.768.000 | 0 | hora congelada |
01-01-2009T00: 00: 00.500 | 1.230.768.000 | 500.000 | ||
6 | 01-01-2009T00: 00: 01.000 | 1.230.768.001 | 0 |
# | UTC | tv_sec | tv_usec | |
---|---|---|---|---|
4 | 31-12-2008T23: 59: 60.000 | 1.230.768.000 | 0 | |
31-12-2008T23: 59: 60.500 | 1.230.768.000 | 250.000 | tempo de desaceleração | |
5 | 01-01-2009T00: 00: 00.000 | 1.230.768.000 | 500.000 | tempo de desaceleração |
01-01-2009T00: 00: 00.500 | 1.230.768.000 | 750.000 | tempo de desaceleração | |
6 | 01-01-2009T00: 00: 01.000 | 1.230.768.001 | 0 |
A ideia de usar o tempo atômico internacional já foi proposta e defendida por muitos, mas não é esse o sentido dado pela história, a escolha escolhida foi aquela que hoje está congelada pelo padrão POSIX.
Daniel J. Bernstein também escreveu artigos e software para o uso de TAI em sistemas semelhantes ao UNIX.
O gigasecond Unix refere-se à hora Unix 10 9 , que representa o9 de setembro de 2001.