Accéder au contenu principal Passer au contenu complémentaire

Date

java.util.Date et java.sql.Date contiennent des horodatages. Le composant tLogRow affiche ces horodatages en se basant sur le modèle que vous configurez. Si le modèle contient YYYY, l'objet de données sous-jacent contiendra davantage d'informations. Les fuseaux horaires sont un autre exemple d'information généralement ignorée, pouvant créer un décalage des dates.

Par exemple, une base de données retourne une date 2021-03-10 Midnight, mais une autre base de données la traite comme 2021-03-10 Midnight in Central Europe GMT+2. Elle la convertit en UTC pour la stocker et la transforme en un type de date dont le résultat est 2021-03-09 après ingestion. C'est souvent perçu comme un bug, mais il y a une raison logique à ce comportement.

La base de données stocke l'objet comme 2021-03-10.

Une fois convertie en Java, la date devient (en fonction de la conversion utilisée) :

  • 2021-03-10 00:00:00.000 UTC
  • 2021-03-10 02:00:00.000 GMT+2

La date est ensuite passée à la base de données, qui la traite comme :

  • 2021-03-10 00:00:00.000 GMT+2
  • 2021-03-09 22:00:00.000 UTC

La conversion vers UTC décale la date d'un jour. Ainsi, lorsque vous rencontrez des problèmes relatifs à des dates, vous devez analyser les dates entières, y compris les fuseaux horaires, les heures et les secondes.

Precision (Précision)

Puisque Talend utilise java.util.Date, la précision des microsecondes et des nanosecondes n'est pas disponible. Cependant, certains composants peuvent vérifier si le type d'objet est java.sql.Timestamp. Dans ce cas, les nanosecondes sont disponibles. Pour les utiliser, sélectionnez le type Object dans la définition du schéma et les composants sources et cibles qui les supportent.

Exécution expérimentale

Vous pouvez effectuer les opérations suivantes lors d'un dépannage :

  • Utilisez un composant tFileOutput pour sauvegarder et lire ces valeurs. Ainsi, vous avez un meilleur contrôle sur les fuseaux horaires.
  • Utilisez le paramètre -Duser.timezone pour voir si cela modifie le comportement. Pour plus d'informations, consultez Time Zone Settings in the JRE (en anglais).
  • Consultez la documentation relative aux pilotes JDBC pour apprendre à gérer ces fuseaux horaires.
  • Utilisez un composant tLogRow avec le modèle et résultat suivants :
    "yyyy-MM-dd'T'HH:mm:ss.SSSXXX" 2001-07-04T12:08:56.235-07:00

La base de données cible peut, ou ne peut pas, stocker la partie horodatage des exemples précédents, combinée au fuseau horaire. Cela risque de décaler les jours.

Solutions de contournement possibles

Utilisez des types String et voyez si les bases de données ou leurs pilotes peuvent gérer la transformation. Avec un type String, vous voyez ce que vous obtenez, il n'y a pas d'information cachée.

Convertissez d'un fuseau horaire à l'autre à l'aide du code Java dans un composant tJavaRow :

String pattern = "yyyy-MM-dd";
log.info(TalendDate.formatDate(pattern, input_row.startDate));
output_row.startDateUTC = TalendDate.parseDateInUTC("yyyy-MM-dd zzz",
TalendDate.formatDate("yyyy-MM-dd", input_row.startDate)+" UTC");

Pour plus d'informations concernant le comportement des données, consultez Your Calendrical Fallacy Is... (en anglais).

Cette page vous a-t-elle aidé ?

Si vous rencontrez des problèmes sur cette page ou dans son contenu – une faute de frappe, une étape manquante ou une erreur technique – faites-le-nous savoir.