Tempo interno
Internamente, um sistema Unix mantém tempo que o número de segundos desde o Unix Epoch. O Unix Epoch foi à meia-noite 1. De janeiro de 1970 UTC. Na região oriental do fuso horário de os E.U. que foi 31. De dezembro de 1969 às 19:00. No começo deste artigo, o tempo é 1171733878. Estou usando o NTP (Network Time Protocol) para manter o relógio do computador em sincronia. Então, no exato instante que o meu computador pensei que era 1171733878, provavelmente o mesmo que fizeram sua. Cada computador deve estar de acordo quanto ao tempo que ele é. Não importa qual fuso horário em seu computador reside ou fuso horário em que você reside. Se eu tivesse escrito para um ficheiro durante a segunda, Unix teria gravado a modificação tempo que 1171733878.
Unix era tradicionalmente uma vez assinados 32 bits inteiro. Isso significa que o tempo máximo é 2147483647, que, no Leste da TimeZone os E.U. seria 18. De janeiro de 2038 às 22:14:07. O plano é para que isto se expandir para um inteiro 64 bits antes de então. Unix segundo uma contagem frente-a-um. Após 1171733878, na próxima segunda que o meu sistema vai conhecer é 1171733879. Uma vez que é syncronized, NTP obras de encurtamento ou alongamento de um segundo. Posso obter o tempo, chamando o sistema de chamada tempo (). Se eu quiser fazer alguma coisa melhor do que o segundo, o próximo mais acurado interface é chamada de sistema vezes (). vezes () principal objectivo é a obtenção de uma estrutura de dados relativos ao sistema de uso. Mas o regresso código também é útil ... é a hora no relógio carrapatos. Relógio carrapatos começar em algum ponto arbitrário no passado (muitas vezes arranque tempo) e eles sempre antecipadamente o kernel relógio rotina será executado. Quantos relógio carrapatos por segundo pode variar. Você pode chamar sysconf (_SC_CLK_TCK) para descobrir o seu valor. 100 é valor comum nos dias de hoje. Sistemas mais antigos utilizados 60. 100 e 60 são os dois únicos valores que tenho visto. Relógio carrapatos também são retornados como um inteiro assinado. Então, após cerca de um ano, o número irá reverter a zero. Excepto capotamento, relógio carrapatos também antecipadamente um-por-um. (Relógio carrapatos são frequentemente chamados de "jiffies" pelo Linux folks). Existe também um outro sistema de chamada, gettimeofday () que retorna o tempo desde o Unix Epoch em segundos e microssegundos. gettimeofday () é necessária para a existência e utilização microsegundo precisão. No entanto, a precisão é explicitamente indeterminado. O microsegundo não adiantam um-por-um, em qualquer sistema que tenho visto. Parto do princípio de que sistemas Unix são bastante boas com hundreths de uma segunda e talvez até mesmo alguns casos é milissegundos. Mas eu não iria assumir qualquer precisão para além disso.
Humano Readable timestamps
Agora que sabemos como Unix mantém tempo, vamos passar a um tema diferente: Como exibir um tempo de usuário. Poucos usuários ficarão felizes com uma hora a ser exibido como 1171733878. Como estou na região oriental do fuso horário de os E.U., gostaria de ver algo como 12:37:58 em 17 fev de 2007. Mas uma pessoa em Los Angeles Califórnia deseja algo parecido com 9:37:58 em 17 fev de 2007. Escrevi um pouco
perl script para exibir o tempo formatado quando administrada como um número 1171733878. Aqui é a saída como ele deve aparecer em ambos os fusos horários do Pacífico Oriental e por alguns timestamps cuidadosamente selecionados:
Leste:
1173596399 domingo 2007/03/11 01:59:59 Hora padrão
1173596400 domingo 2007/03/11 03:00:00 Daylight Saving Time
1173607199 domingo 2007/03/11 05:59:59 Daylight Saving Time
1173607200 domingo 2007/03/11 06:00:00 Daylight Saving Time
Pacífico:
1173596399 sábado 2007/03/10 22:59:59 Hora padrão
1173596400 sábado 2007/03/10 23:00:00 Hora padrão
1173607199 domingo 2007/03/11 01:59:59 Hora padrão
1173607200 domingo 2007/03/11 03:00:00 Daylight Saving Time
Repare que o tempo interno do Unix não mudar com o início de horário de verão. O que acontece é que uma nova regra para o modo de exibição do tempo produz efeitos. Para converter interno tempo para uma hora, Unix precisa saber qual o fuso horário para uso. E é preciso saber se a Hora de Verão está em vigor. Existem várias sub-rotinas que podem ser chamados para formatar uma hora. Todas estas eventualmente invocar tzset () para determinar o fuso horário e ao estado de Daylight Saving. E tzset verifica sempre para a variável de ambiente TZ para descobrir o que o usuário deseja. Se você não uma variável de ambiente TZ, tzset () vai com algum tipo de defeito que pode variar de sistema para sistema. O ambiente TZ variável é frequentemente definido para algo como EST5EDT4 que é o que eu uso. Este diz que estou em um fuso horário EST, que é chamado de Tempo Universal compensado por 5 horas e durante o dia Daylight Saving meu fuso horário EDT que é chamado de Tempo Universal é compensada por 4 horas. Para saber quando Hora de Verão está em vigor, tzset analisará alguns dados no arquivo. Que imagem (e do que o arquivo está no formato) varia de sistema para sistema. Os patches que estão disponíveis para este ano da mudança na Daylight Saving realmente deve ser pouco mais do que algumas revisões para estes arquivos.
Tempo Universal
Para além de saber sobre o seu fuso horário, um Unix devem ser capazes de usar Tempo Universal (que é praticamente o mesmo que o antigo Greenwich Mean Time). Isto é o que "data-u" faz. A definição para o Tempo Universal é bem conhecido e não impliquem alterações horário de verão. O Tempo Universal definição pode ser construir em rotinas da data em vez de usar o arquivo de dados para tzset (). Isso pode ser verdade mesmo se uma entrada está presente para UTC. Correio programas utilizam frequentemente UTC timestamps.