Technologies

Adobe ne connait pas la crise : le choc pétrolier n’a jamais eu lieu !

Publié le : Auteur: Christian CHABOT 3 commentaires
technologies

Nous avons rencontré au cours d’un projet un cas étrange dont nous souhaitions faire part sur ce blog.
S’il pouvait au départ faire douter du déterminisme douillet dans lequel nous place notre profession, du moins en ce qui concerne les interactions avec les systèmes informatiques, son explication mérite à tout le moins d’être partagée.

Voici les faits : il s’agit d’un comportement pour le moins curieux observé lors de la sérialisation de beans Flex vers Java, en l’occurrence des objets de transfert de valeurs de type Date, et ce pour une date de naissance positionnée au 24/10/1960.

  • En AS3, on crée un DTO Date dont la valeur interne (objet Date standard) contient 24/10/1960 00:00:00. Flex envoie au serveur Java la date sous la forme d’un nombre de millisecondes depuis le 01/01/1970.
  • En Java, on récupère cette valeur et on crée un objet java.util.Date. Le problème survient à ce moment : en Java, cet objet vaut 23/10/1960 23:00:00 …

Lors de l’utilisation de ce DTO Date, on a perdu un jour, ce qui pause bien évidemment un sérieux souci.

Il semble apparemment que Flex et Java ne soient pas d’accord sur le calcul des heures d’été / heures d’hiver pour des dates anciennes. Cet article décrit exactement le même constat.

 

Des questions viennent immédiatement à l’esprit :

  •  Y a-t-il une configuration particulière à faire côté Flex ou Java ?
  •  Y a-t-il un problème avec la locale ?

Dans les deux cas, Java et Flex, on utilise la locale système par défaut sans moyen de la paramétrer ; l’article suggère plutôt une différence sur les algorithmes de calcul du Daytime Saving (Heure d’été / Heure d’hiver) pour les dates anciennes.
Un deuxième test avec une date récente au 24/10/2011 ne fait plus apparaître ce problème. En examinant la question, on constate que Flex crée la date du 24/10/1960 dans le fuseau GMT+2 et GMT+2 correspond en France à l’heure d’été et GMT+1 à l’heure d’hiver.

Le problème, c’est que l’heure d’été n’a été instaurée en France qu’en 1976 après le choc pétrolier !

Il semble donc qu’il y ait bien une différence d’algorithme de calcul du DST (Daylight Saving Time) entre Flex et Java comme suggéré dans l’article. Après une enquête plus approfondie, ce problème avec les dates entre Flex et Java existe bien, sachant qu’AMF ne tient pas compte de la timezone. Il a été évoqué avec le support d’Adobe en 2009, sans qu’il ait visiblement donné lieu à un correctif dans BlazeDS/LCDS.

Encore un bel exemple après l’an 2000 où l’informatique malmène l’Histoire …

  • Ronan BERNABE

    Cela me rappelle des soucis de failles spatio-temporelles découvertes durant un projet mettant en œuvre des services web faisant transiter des données entre d’une part un moteur Java et d’autre part un moteur .Net.

    Dans le cas du projet, des dates de naissance qui semblaient changer toutes seules durant l’acheminement des données.

    Faute d’application de la loi sur la relativité, l’erreur provenait de la sérialisation/désérialisation des dates, non homogène entre les deux langages…

  • Girardot

    J’ai trouvé un bug du même genre dans Excel !! (si vous êtes intéressé, je vous le décris…).

    Note 1 : on ne dit pas GMT, mais TU (Temps Universel), depuis une certaine date…

    Note 2 : il faut tester les outils avec les dates juliennes…. En France, on est passé du 9 au 20 décembre 1582 sans transition, et en Italie, 14 au 25 octobre de la même année… Et en Angleterre, beaucoup + tard. Merci Grégoire XIII.

    Je tiens à votre disposition le programme du calcul du jour correspondant à une date grégorienne dans un certain nombre de langages (algo maison qui ne convertit pas en micro-temps), qui peut être appliquée sans ordinateur, simplement de tête.

  • Le calcul des dates et des heures est toujours quelque chose de compliqué pour les programmeurs car il faut prendre en compte certaines spécificités. Heureusement aujourd’hui les bibliothèques gèrent assez bien cela, sauf peut être dans le cas présentés ci dessus.