2010-12-08 56 views
3

Mes excuses pour la question extrêmement basique, je pense que je connais la réponse, mais je voudrais vérifier:Demande de vérification - Comment les bases de données et Java stockent et gèrent les fuseaux horaires?

Lorsque des zones se référant à temps et la façon dont ils sont généralement stockés dans une base de données et dans un java.util.Date:

  • lors de l'enregistrement d'un champ de date dans une base de données, il est fuseau horaire agnostique (par exemple, enregistre toujours en UTC)
  • lorsque vous utilisez une date Java objet la date est fuseau horaire aussi agnostique
  • fuseau horaire est depeneded que lorsque dates de formatage et d'analyse (DB et Java)
  • Si vous utilisez Java - il utilisera le user.timezone JVM au format/analyser les dates
  • Si vous utilisez Java sous Windows - Java prendra ce à partir des paramètres régionaux automatiquement
  • Le fuseau horaire de base de données (et il est le fuseau horaire de la machine) est sans rapport avec le client Java JDBC
  • le fuseau horaire du serveur de base de données est pertinente que pour l'analyse syntaxique SQL directe et formattage

Mes questions sont les suivantes:

  1. Toutes les hypothèses ci-dessus sont-elles correctes? certains sont? tout incorect?
  2. Existe-t-il une référence/source officielle qui vérifie cela plus "officiellement"?

Répondre

1

Les hypothèses sont généralement correctes pour Java. Ils ne sont pas nécessairement corrects pour les bases de données, car il existe des variations. Java gère les fuseaux horaires avec les objets Calendrier. L'objet java.util.Date contient toujours la valeur UTC.

Les bases de données stockent et renvoient généralement les dates et les horodatages (avec les heures, les minutes, etc.) tels qu'ils sont écrits, quel que soit le format interne utilisé par le stockage. Si vous stockez 2010-12-25, vous récupérez la même valeur quel que soit le fuseau horaire des clients ou du serveur.

Certaines bases de données ont le type de données TIMESTAMP WITH TIMEZONE qui stocke à la fois l'horodatage et le fuseau horaire séparément.

Les dates et les horodatages sont convertis entre Java et la base de données, généralement de manière à ce que les sous-classes de java.util.Date utilisées soient interprétées dans le fuseau horaire du client JDBC.

+0

Donc j'avais raison, le fuseau horaire est pour le formatage, et toutes les dates sont sauvegardées en "UTC" soit par définition, soit par convention ... n'est-ce pas? –

+0

En Java, ils sont tous UTC. Dans les systèmes de base de données, la méthode de stockage varie, mais généralement quelque chose comme 2010-12-25 12:30:15 est stocké et récupéré exactement comme il est écrit, indépendamment des fuseaux horaires. Vous pouvez essayer avec HSQLDB 2.0.1, qui prend en charge TIMESTAMP WITH TIME ZONE ainsi que sans fuseau horaire et voir les résultats. – fredt