¿Por qué las marcas de tiempo tienen un límite para 2038?
Pregunta
Acabo de descubrir, ejecutando un script de calendario, que las marcas de tiempo en PHP tienen un límite de 2038. ¿Qué significa realmente?¿Por qué es 2038 en lugar de 2050 o 2039?¿Por qué un límite si las marcas de tiempo solo cuentan los segundos desde una fecha determinada (1970)?
Solución
El límite lo imponen los números enteros de 4 bytes con signo que utilizan la mayoría de las bibliotecas de C para representar ese recuento.Matemáticas rápidas (asume 365 días de años, no exactamente correcto):
2147483648 seconds ~ 68.1 years
Esto también implica un límite inferior de ~ 1900.Algunas bibliotecas han comenzado a introducir recuentos de época de 64 bits, pero son pocas y distantes por el momento.
Otros consejos
El valor máximo de un entero de 32 bits es 2,147,483,647.Si agrega +1 a eso, obtiene -2,147,483,647.2,147,483,647 segundos desde 01-01-1970 00:00:00 es el 19 de enero de 2038. Si agrega un segundo más, obtendrá una fecha en algún lugar en 1902.
debido al límite del tipo de datos INT en una máquina de 32 bits
http://php.net/manual/en/function.mktime.php
Desde php.net: "La fecha máxima posible aceptada por mktime () y gmmktime () depende de la zona horaria de la ubicación actual.
Por ejemplo, el desbordamiento de la marca de tiempo de 32 bits se produce en 2038-01-19T03: 14: 08 + 0000Z.Pero si se encuentra en una zona horaria UTC -0500 (como EST en América del Norte), el tiempo máximo aceptado antes del desbordamiento (para versiones anteriores de PHP en Windows) es 2038-01-18T22: 14: 07-0500Z, independientemente deya sea que lo esté pasando a mktime () o gmmktime () ".
Supongo que se almacena en un número fijo de bits, lo que significa un límite en el tamaño que puede llegar a tener la marca de tiempo.Podríamos hacer algunos cálculos matemáticos para averiguarlo exactamente.