Résultats d’horodatage incohérents avec les applications JDBC

Problème

Lorsque vous utilisez des applications JDBC avec des clusters Azure Databricks, vous constatez des résultats incohérents java.sql.Timestamp lors du basculement entre l’heure d’hiver et l’heure d’été.

Cause

Les clusters Azure Databricks utilisent l’heure UTC par défaut.

java.sql.Timestamp utilise le fuseau horaire local de JVM.

Si un cluster Azure Databricks retourne 2021-07-12 21:43:08 sous forme de chaîne, JVM l’analyse en tant que 2021-07-12 21:43:08 et suppose que le fuseau horaire est local.

Cela fonctionne normalement pour la majeure partie de l’année, mais lorsque le fuseau horaire local a un ajustement à l’heure d’été, cela provoque un problème, car l’heure UTC ne change pas.

Par exemple, le 14 mars 2021, les États-Unis sont passés de l’heure d’hiver à l’heure d’été. Cela signifie que l’heure locale est passée de 1:59 à 3:00 AM.

Si un cluster Azure Databricks retourne 2021-03-14 02:10:55 , la JVM la convertit automatiquement en, 2021-03-14 03:10:55 car 02:10:55 n’existe pas dans l’heure locale à cette date.

Solution

Option 1 : Configurez le fuseau horaire de JVM sur UTC.

Définissez la propriété user.timezone sur GMT.

Pour plus d’informations, consultez la documentation relative aux paramètres de fuseau horaire Java .

Option 2 : Utilisez ODBC au lieu de JDBC. ODBC interprète les horodateurs en tant qu’heure UTC.

Vous pouvez également utiliser turbodbc.

Option 3 : Définissez le fuseau horaire local sur UTC dans votre application JDBC.

Consultez la documentation de votre application JDBC pour savoir comment configurer les paramètres de fuseau horaire local.