tag remove name first day all php timestamp year2038

php - remove - ¿Por qué las marcas de tiempo tienen un límite de 2038?



strtotime+1 day (4)

Acabo de descubrir, ejecutando un script de calendario, que las marcas de tiempo en PHP tienen un límite hasta 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 a partir de una fecha determinada (1970)?


Debido al límite del tipo de datos INT en la 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 actual de la ubicación.

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 las versiones más antiguas de PHP en Windows) es 2038-01-18T22: 14: 07-0500Z, independientemente de si lo estás pasando a mktime () o gmmktime (). "


El límite lo imponen los enteros con signo de 4 bytes que la mayoría de las bibliotecas de C usan para representar ese conteo. Matemáticas rápidas (asume 365 días, no exactamente correctas):

2147483648 seconds ~ 68.1 years

Esto también implica un límite inferior de ~ 1900. Algunas bibliotecas han comenzado a introducir conteos de épocas de 64 bits, pero son pocas y distantes entre sí por el momento.


El valor máximo de un entero de 32 bits es 2.147.483.647. Si agregas +1 a eso, obtienes -2,147,483,647. 2,147,483,647 segundos del 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.


Mi conjetura es que se almacena en un número fijo de bits, lo que significa un límite en cuanto al tamaño de la marca de tiempo. Podríamos hacer algunos cálculos para resolverlo exactamente.