8 votes

Erreur de conversion en UTC après 2038 sur unix 64 bits PHP

Je dois convertir les informations de date et d'heure de l'heure locale (gtm+1) en UTC en utilisant php (5.4). sur Centos 7.4 64 bits

J'ai essayé la procédure suivante :

function convertToUtc ($date)
{
  $dateTime = new DateTime ($date, new DateTimeZone('Europe/Rome'));
  $dateTime->setTimezone(new DateTimeZone('UTC'));
  return $dateTime->format('Y-m-d') . 'T' . $dateTime->format('H:i:s') . 'Z';
}

Cela fonctionne jusqu'en 2038, après quoi il calcule mal l'heure d'été et retourne toujours avec un décalage d'une heure :

2037 : tout est ok

LOCAL TIME           ->  UTC TIME

2037-03-28 10:12:13  ->  2037-03-28T09:12:13Z   the day before dst change

2037-03-29 10:12:13  ->  2037-03-29T08:12:13Z   the first DST day

2037-10-24 10:12:13  ->  2037-10-24T08:12:13Z   the last DST day

2037-10-25 10:12:13  ->  2037-10-25T09:12:13Z   the day after

2038 : ok until dst change

2038-03-27 10:12:13  ->  2038-03-27T09:12:13Z   OK

2038-03-28 10:12:13  ->  2038-03-28T09:12:13Z   error : should be 2038-03-28 08:12:13Z

2038-10-30 10:12:13  ->  2038-10-30T09:12:13Z   error : should be 2038-10-30 08:12:13Z

2038-10-31 10:12:13  ->  2038-10-31T09:12:13Z   OK

VEUILLEZ NOTER : l'arithmétique des dates ne semble pas affectée par la limite du timestamp unix (19/1/2018) puisque les expressions suivantes fonctionnent correctement :

$date = new DateTime();
$date->modify('+100 year');
echo $date->format('Y-m-d');

(Il imprime 2118-04-23)

Des suggestions ? Salutations maurizio

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X