usando una tablas tabla registros para mostrar listar inteligente formulario extraer datos codigo busqueda buscar buscador avanzado php mysql year2038

una - PHP y MySQL: Año 2038 Error: ¿Qué es? ¿Cómo resolverlo?



mostrar datos de mysql en php en una tabla html (6)

Al usar las marcas de tiempo de UNIX para almacenar fechas, en realidad está usando números enteros de 32 bits, que cuentan la cantidad de segundos desde 1970-01-01; ver el tiempo de Unix

Ese número de 32 bits se desbordará en 2038. Ese es el problema 2038.


Para resolver ese problema, no debe usar una marca de tiempo UNIX de 32 bits para almacenar sus fechas, lo que significa que al usar MySQL, no debe usar TIMESTAMP , sino DATETIME (consulte 10.3.1. Tipos DATETIME, DATE y TIMESTAMP ) :

El tipo DATETIME se usa cuando necesita valores que contienen información de fecha y hora. El rango admitido es ''1000-01-01 00:00:00'' a ''9999-12-31 23:59:59'' .

El tipo de datos TIMESTAMP tiene un rango de ''1970-01-01 00:00:01'' UTC a ''2038-01-19 03:14:07'' UTC.


Lo (probablemente) lo mejor que puede hacer con su aplicación para evitar / corregir ese problema es no usar TIMESTAMP , sino DATETIME para las columnas que deben contener fechas que no están entre 1970 y 2038.

Una pequeña nota, sin embargo: hay una muy alta probabilidad (estadísticamente hablando) de que tu solicitud haya sido reescrita un par de veces antes de 2038 ^^ Así que tal vez, si no tienes que lidiar con fechas en el futuro , no tendrá que ocuparse de ese problema con la versión actual de su aplicación ...

Estaba pensando en usar TIMESTAMP para almacenar la fecha + hora, pero he leído que hay una limitación del año 2038 en él. En lugar de hacer mi pregunta a granel, preferí dividirla en partes pequeñas para que los usuarios noveles también pudieran comprenderla fácilmente. Entonces mi pregunta (s):

  1. ¿Cuál es exactamente el problema del año 2038?
  2. ¿Por qué ocurre y qué pasa cuando ocurre?
  3. ¿Como lo resolvemos?
  4. ¿Hay alguna alternativa posible para usarlo, que no plantea un problema similar?
  5. ¿Qué podemos hacer con las aplicaciones existentes que usan TIMESTAMP, para evitar el llamado problema, cuando realmente ocurre?

Gracias por adelantado.


Bros, si necesita usar PHP para mostrar las marcas de tiempo, esta es la MEJOR solución PHP sin cambiar el formato UNIX_TIMESTAMP.

Use una función custom_date (). Dentro de él, usa DateTime. Aquí está la solución DateTime .

Siempre y cuando tenga UNSIGNED BIGINT (8) como sus marcas de tiempo en la base de datos. Mientras tengas PHP 5.2.0 ++


Como no quería actualizar nada, ¡le pedí a mi backend (MSSQL) que hiciera este trabajo en lugar de PHP!

$qry = "select DATEADD(month, 1, :date) next_date "; $rs_tmp = $pdo->prepare($qry); $rs_tmp->bindValue(":date", ''2038/01/15''); $rs_tmp->execute(); $row_tmp = $rs_tmp->fetch(PDO::FETCH_ASSOC); echo $row_tmp[''next_date''];

Puede que no sea una manera eficiente, pero funciona.


Una búsqueda rápida en Google hará el truco: problema del año 2038

  1. El problema del año 2038 (también conocido como Unix Millennium Bug, Y2K38 por analogía al problema del Y2K) puede causar que algunos programas informáticos fallen antes o en el año 2038.
  2. El problema afecta a todos los software y sistemas que almacenan la hora del sistema como un entero de 32 bits con signo e interpretan este número como el número de segundos desde las 00:00:00 UTC del 1 de enero de 1970. El último momento que se puede representar de esta manera es 03:14:07 UTC del martes 19 de enero de 2038. Los tiempos posteriores a este momento se "envolverán" y se almacenarán internamente como un número negativo, que estos sistemas interpretarán como una fecha en 1901 en lugar de 2038
  3. No existe una solución fácil para este problema para las combinaciones existentes de CPU / sistema operativo, sistemas de archivos existentes o formatos de datos binarios existentes

http://en.wikipedia.org/wiki/Year_2038_problem tiene la mayoría de los detalles

En resumen:

1) + 2) El problema es que muchos sistemas almacenan información de fecha como un int firmado de 32 bits igual a la cantidad de segundos desde 1/1/1970. La última fecha que se puede almacenar de este modo es 03:14:07 UTC el martes 19 de enero de 2038. Cuando esto sucede, int se "ajustará" y se almacenará como un número negativo que se interpretará como una fecha en 1901. Lo que sucederá exactamente entonces, varía de un sistema a otro, pero basta con decir que probablemente no sea bueno para ninguno de ellos.

Para sistemas que solo almacenan fechas en el pasado, ¡entonces supongo que no necesita preocuparse por un tiempo! El problema principal es con sistemas que funcionan con fechas en el futuro. Si su sistema necesita funcionar con fechas de 28 años en el futuro, entonces ¡debería comenzar a preocuparse ahora!

3) Utilice uno de los formatos de fecha alternativos disponibles o muévase a un sistema de 64 bits y use entradas de 64 bits. O para bases de datos, use un formato de sello de tiempo alternativo (por ejemplo, para MySQL use DATETIME)

4) Ver 3!

5) Ver 4! ;)


Lo he marcado como wiki de la comunidad, así que siéntete libre de editarlo a tu gusto.

¿Cuál es exactamente el problema del año 2038?

"El problema del año 2038 (también conocido como Unix Millennium Bug, Y2K38 por analogía con el problema del Y2K) puede causar que algunos programas informáticos fallen antes o en el año 2038. El problema afecta a todos los software y sistemas que almacenan el sistema -bit entero, e interprete este número como el número de segundos desde las 00:00:00 UTC del 1 de enero de 1970. "

¿Por qué ocurre y qué pasa cuando ocurre?

Los tiempos posteriores a las 03:14:07 UTC del martes 19 de enero de 2038 se "envolverán" y se almacenarán internamente como un número negativo, que estos sistemas interpretarán como una hora del 13 de diciembre de 1901 en lugar de 2038. Esto se debe a el hecho de que la cantidad de segundos desde la época de UNIX (1 de enero de 1970 00:00:00 GMT) excedió el valor máximo de una computadora para un entero de 32 bits con signo.

¿Como lo resolvemos?

  • Usar tipos de datos largos (64 bits es suficiente)
  • Para MySQL (o MariaDB), si no necesita la información de tiempo, considere usar el tipo de columna DATE . Si necesita mayor precisión, use DATETIME lugar de TIMESTAMP . Tenga en cuenta que las columnas DATETIME no almacenan información sobre la zona horaria, por lo que su aplicación deberá saber qué zona horaria se utilizó.
  • Otras posibles soluciones descritas en Wikipedia
  • Espere a que los desarrolladores de MySQL arreglen este error reportado hace más de una década.

¿Hay alguna alternativa posible para usarlo, que no plantea un problema similar?

Intente siempre que sea posible usar tipos grandes para almacenar fechas en bases de datos: 64 bits es suficiente: un tipo largo y largo en GNU C y POSIX / SuS, o sprintf(''%u''...) en PHP o la extensión BCmath.

¿Cuáles son algunos casos de uso que potencialmente pueden romperse aunque aún no estemos en 2038?

Entonces, un DATETIME MySQL tiene un rango de 1000-9999, pero TIMESTAMP solo tiene un rango de 1970-2038. Si su sistema almacena fecha de nacimiento, fechas futuras (por ejemplo, hipotecas de 30 años) o similares, ya se encontrará con este error. De nuevo, no use TIMESTAMP si esto va a ser un problema.

¿Qué podemos hacer con las aplicaciones existentes que usan TIMESTAMP, para evitar el llamado problema, cuando realmente ocurre?

Pocas aplicaciones PHP seguirán existiendo en 2038, aunque es difícil prever ya que la web aún no es una plataforma heredada.

Aquí hay un proceso para alterar una columna de tabla de base de datos para convertir TIMESTAMP a DATETIME . Comienza con la creación de una columna temporal:

# rename the old TIMESTAMP field ALTER TABLE `myTable` CHANGE `myTimestamp` `temp_myTimestamp` int(11) NOT NULL; # create a new DATETIME column of the same name as your old column ALTER TABLE `myTable` ADD `myTimestamp` DATETIME NOT NULL; # update all rows by populating your new DATETIME field UPDATE `myTable` SET `myTimestamp` = FROM_UNIXTIME(temp_myTimestamp); # remove the temporary column ALTER TABLE `myTable` DROP `temp_myTimestamp`

Recursos