Perché i timestamp hanno un limite al 2038?
Domanda
Ho appena scoperto, eseguendo uno script di calendario, che i timestamp in PHP hanno un limite a 2038. Cosa significa veramente?Perché è il 2038 anziché il 2050 o il 2039?Perché un limite se i timestamp contano solo i secondi da una determinata data (1970)?
Soluzione
Il limite è imposto dagli interi con segno a 4 byte che la maggior parte delle librerie C utilizza per rappresentare quel conteggio.Matematica veloce (si presuppone che 365 giorni l'anno, non esattamente corretto):
2147483648 seconds ~ 68.1 years
Ciò implica anche un limite inferiore di ~ 1900.Alcune librerie hanno iniziato a introdurre il conteggio delle epoche a 64 bit, ma per il momento sono poche e lontane tra loro.
Altri suggerimenti
Il valore massimo di un numero intero a 32 bit è 2.147.483.647.Se aggiungi +1 a questo, ottieni -2.147.483.647.2.147.483.647 secondi da 01-01-1970 00:00:00 è il 19 gennaio 2038. Se aggiungi un secondo in più, ottieni una data da qualche parte nel 1902.
a causa del limite del tipo di dati INT su una macchina a 32 bit
http://php.net/manual/en/function.mktime.php
Da php.net: "La data massima possibile accettata da mktime () e gmmktime () dipende dal fuso orario della posizione corrente.
Ad esempio, l'overflow del timestamp a 32 bit si verifica in 2038-01-19T03: 14: 08 + 0000Z.Ma se ti trovi in un fuso orario UTC -0500 (come EST in Nord America), il tempo massimo accettato prima dell'overflow (per le versioni PHP precedenti su Windows) è 2038-01-18T22: 14: 07-0500Z, indipendentemente dasia che tu lo passi a mktime () o gmmktime (). "
la mia ipotesi è che sia memorizzato in un numero fisso di bit, il che significa un limite su quanto grande può ottenere il timestamp.Potremmo fare un po 'di matematica per capirlo esattamente.