Por que um número inteiro assinado é usado para representar registros de data e hora? Há um começo claramente definido em 1970, que é representado como 0, então por que precisaríamos de números antes disso? Os carimbos de data e hora negativos são usados em algum lugar?
timestamps
Bakudan
fonte
fonte
Respostas:
As versões anteriores do C não tinham números inteiros não assinados. (Alguns programadores usavam ponteiros quando precisavam de aritmética sem sinal.) Não sei o que veio primeiro, o
time()
função ou os tipos não assinados, mas suspeito que a representação foi estabelecida antes que os tipos não assinados estivessem disponíveis universalmente. E 2038 foi longe o suficiente no futuro para que provavelmente não valia a pena se preocupar. Duvido que muitas pessoas pensassem que o Unix ainda existiria até então.Outra vantagem de um sinal
time_t
é que estendê-lo para 64 bits (o que já está acontecendo em alguns sistemas) permite representar vezes centenas de bilhões de anos no futuro, sem perder a capacidade de representar tempos antes de 1970. (É por isso que me oponho a mudar para um Não assinado de 32 bitstime_t
; temos tempo suficiente para fazer a transição para 64 bits.)fonte
time
função é anterior à época: o Unix v1 (em 1971) contava em unidades de 1/60 de segundo, a partir da meia-noite de 01/01/1971. Já era um bug conhecido que “o usuário com espírito cronológico notará que 2 ** 32 sessenta de segundo são apenas cerca de 2,5 anos.”unsigned
Foi introduzido pela K&R em 1978 , muito depois da época de 1970 ter sido estabelecida.gmtime
elocaltime
max out no ano 2147483647 (com o segundo seguinte depois de atribuir -2147483648 como o ano). Portanto, para ultrapassar os 55 bits de tempo, alguém precisará atualizar a rotina de saída para usar um int de 64 bits para o ano, em vez de um int de 32 bits não assinado. Espero que alguém cuide desse bug nos próximos bilhões de anos.struct tm
tipo tem um membrotm_year
(representando anos desde 1900) que é do tipoint
. Os sistemas de 64 bits podem facilmente ter um de 64 bitstime_t
, mas geralmente têm 32 bitsint
. (Sechar
for 8 bits eint
64 bits,short
pode ser 16 ou 32 bits e não haverá tipo predefinido para o outro tamanho.) Mastime()
provavelmente é a única função<time.h>
que realmente requer suporte no nível do sistema; você pode escrever seu próprio código para convertertime_t
valores em seqüências legíveis por humanos.É para apoiar registros de data e hora antes de 1º de janeiro de 1970.
fonte
time_t
ter apenas 32 bits; já é de 64 bits em muitos sistemas.mktime()
A função retorna-1
em caso de erro, portanto, é provavelmente impossível distinguir entre carimbos de data e hora corretos antes de 01-01-2009 e erro ts. Datas apparenlty antes 1970-01-01 são proibidos1969-12-31 23:59:59 UTC
. Um valor negativo diferente de não-1
ambíguo.mktime()
chamada para definirerrno
. (POSIX faz.)