Comment utiliser Joda-Time avec java.sql.Timestamp
J'Ai un déclaration préparée à l'avance
INSERT INTO mst(time) VALUES (?);
où le temps est de type Timestamp dans un PostgreSQL base de données.
Je suis de l'insertion d'une Joda-Time DateTime objet, ou, devrais-je dire que je suis en train de. Je ne trouve pas de moyen de convertir l'objet DateTime dans un java.sql.Timestamp. J'ai lu le Joda-Time docs et ne vois pas de référence à la présente.
Grâce.
InformationsquelleAutor WolfmanDragon | 2009-07-01
Vous devez vous connecter pour publier un commentaire.
Vous pouvez convertir un Joda DateTime pour une longue (millis depuis l'époque) d'abord, puis de créer un Timestamp à partir de cela.
new DateTime(timeStamp.getTime())
.getTime
dans votre suggestion à Joda-Time version 2.3. Simplement passer le java.sql.Horodatage de l'objet DateTime constructeur, comme ceci:new DateTime( timeStamp )
, si une meilleure pratique serait de spécifier un fuseau horaire comme ceci:new DateTime( timeStamp, DateTimeZone.UTC )
Voir le frère de réponse par KarlKFI.new Timestamp()
utilise en interne javaCalendar
, qui est initialisé avec local env fuseau horaire. Ainsi, lorsque vous ajoutez ce timestamp d'une requête à un serveur, il envoie année/mois/jour/etc, pas de nanos. Donc, si vous stockez vos horodatages UTC sur le serveur (comme beaucoup de gens le font, et MySQL ne peut stocker en UTC), ce code ne fonctionnera pas correctement -- le TIMESTAMP envoyé au serveur noterons différents instantanée (différents millisecondes) que ce qui était dans votre Joda DateTime.JodaTime de DateTime constructeur peut s'en occuper maintenant.
(Je ne suis pas sûr si c'était vrai lorsque la question a été posté, mais c'est un haut de résultats sur Google alors j'ai pensé ajouter une nouvelle solution).
Il y a quelques options de l'API:
Les deux options accepter java.sql.Timestamp car il s'étend java.util.Date, mais le Nanosecondes seront ignorées (parqueté), parce que DateTime et la Date ont milliseconde*. En l'absence d'un fuseau horaire, il sera par défaut à DateTimeZone.UTC.
<Didactique Mode>
"Résolution" est combien de chiffres sont fournis. "Précision" est le degré de précision de la représentation. Par exemple, MSSQL du DateTime a milliseconde, mais seulement environ 1/3 de seconde précision (DateTime2 est variable résolution et une plus grande précision).
</Didactique Mode>
UTC Timestamp avec Milliseconde Exemple:
Si vous êtes à l'aide d'HORODATAGE AVEC le fuseau HORAIRE dans votre base de données, alors vous ne pouvez pas utiliser java.sql.Timestamp, car il ne prend pas en charge les fuseaux horaires. Vous devrez utiliser un jeu de résultats#getString et analyser la chaîne.
Timestamp sans fuseau Horaire avec la Deuxième Résolution de l'Exemple**:
UTC Timestamp avec la Deuxième Résolution de l'Exemple**:
Timestamp avec fuseau Horaire (décalage format) avec la Deuxième Résolution de l'Exemple**:
Bonus: DateTimeFormat#forPattern statiquement les caches des analyseurs par le modèle de sorte que vous n'avez pas à.
<Didactique Mode>
Je recommande généralement à l'aide d'une Chaîne de caractères dans votre DBO modèle afin de faire la résolution explicite et éviter de générer des objets intermédiaires. (Est 2013-11-14 09:55:25 égal à 2013-11-14 09:55:25.000?) En général j'ai essayer de faire la distinction entre le "modèle de base de données objets" optimisation pour la préservation des données de préoccupations et de modèle d'affaires "objets" de l'optimisation des niveaux de service l'utilisation d'une transformation/couche de mappage entre les deux. Je trouve d'avoir CRUD en fonction DAOs générer des objets directement a tendance à mélanger les priorités et les optimiser pour les deux, lancer des exceptions à des endroits inattendus en raison de manquer des cas limites. Ayant explicite de la transformation de la couche vous permet également d'ajouter de la validation si nécessaire, comme si vous n'avez pas le contrôle de la source de données. Séparer les préoccupations rend également plus facile à tester chaque couche indépendamment.
</Didactique Mode>
* Si vous avez besoin de régler à l'ordre de la nanoseconde résolution dans votre modèle d'affaires que vous aurez à utiliser une autre bibliothèque.
** Timestamp format de Chaîne de caractères peut varier entre les bases de données, pas sûr.
If you're using TIMESTAMP WITH TIME ZONE in your database then you can't use java.sql.Timestamp
. Malgré son nom trompeur, le typeTIMESTAMP WITH TIME ZONE
ne pas stocker les informations de fuseau horaire. Ce type estime de fuseau horaire lors de l'insertion et de la récupération d'une date de valeur en temps mais toujours stocke la valeur de l'UTC. On peut donc récupérer unTIMESTAMP WITH TIME ZONE
valeur en tant que JDBC de typejava.sql.Timestamp
objet pour nourrir constructeur deorg.joda.time.DateTime
instance. J'ai testé à l'aide de lanow()
fonction.