J'ai un déclaration préparée
INSERT INTO mst(time) VALUES (?);
où le temps est de type Timestamp dans une base de données PostgreSQL .
J'insère un objet Joda-TimeDateTime , ou je devrais dire que j'essaye. Je ne peux trouver aucun moyen de convertir l'objet DateTime en Java.sql.Timestamp . J'ai lu les documents Joda-Time et je ne vois aucune référence à cela.
Merci.
Vous pouvez d'abord convertir un Joda DateTime en un long (millis depuis l'époque), puis créer un horodatage à partir de cela.
DateTime dateTime = new DateTime();
Timestamp timeStamp = new Timestamp(dateTime.getMillis());
Le constructeur DateTime de JodaTime peut gérer cela pour vous maintenant. (Je ne sais pas si cela était vrai lorsque la question a été publiée, mais c'est un résultat Google top, alors j'ai pensé ajouter une solution plus récente.)
Il y a quelques options d'API:
public DateTime(Object instant);
public DateTime(Object instant, DateTimeZone zone);
Les deux options acceptent Java.sql.Timestamp car il étend Java.util.Date, mais les nanosecondes seront ignorées (planifiées), car DateTime et Date n'ont qu'une résolution en millisecondes *. Sans fuseau horaire spécifique, il sera par défaut à DateTimeZone.UTC.
<Mode didactique>
La "résolution" est le nombre de chiffres fournis. La "précision" est la précision de la représentation. Par exemple, DateTime de MSSQL a une résolution en millisecondes, mais seulement ~ 1/3 de seconde de précision (DateTime2 a une résolution variable et une précision plus élevée).
</ Mode didactique>
Horodatage UTC avec exemple de résolution en millisecondes:
new DateTime(resultSet.getTimestamp(1));
Si vous utilisez TIMESTAMP WITH TIME ZONE dans votre base de données, vous ne pouvez pas utiliser Java.sql.Timestamp, car il ne prend pas en charge les fuseaux horaires. Vous devrez utiliser ResultSet # getString et analyser la chaîne.
Horodatage sans fuseau horaire avec deuxième exemple de résolution **:
LocalDateTime dt = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss")
.parseLocalDateTime(resultSet.getString(1));
Horodatage UTC avec deuxième exemple de résolution **:
DateTime dt = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss")
.parseDateTime(resultSet.getString(1));
Horodatage avec fuseau horaire (format offset) avec deuxième exemple de résolution **:
DateTime dt = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss Z")
.parseDateTime(resultSet.getString(1));
Bonus: DateTimeFormat # forPattern met en cache statiquement les analyseurs par modèle afin que vous n'ayez pas à le faire.
<Mode didactique>
Je recommande généralement d'utiliser une chaîne dans votre modèle DBO afin de rendre la résolution explicite et d'éviter de générer des objets intermédiaires. (Le 2013-11-14 09:55:25 est-il égal au 2013-11-14 09: 55: 25.000?) J'essaie généralement de faire la distinction entre les "objets de modèle de base de données" optimisés pour des problèmes de conservation des données et les "objets de modèle d'entreprise" optimisés pour utilisation du niveau de service avec une couche de transformation/mappage entre les deux. Je trouve que le fait d'avoir des DAO basés sur CRUD générant directement des objets métier a tendance à confondre les priorités et à optimiser pour aucun, levant des exceptions à partir d'endroits inattendus en raison de cas Edge manqués. Le fait d'avoir une couche de transformation explicite vous permet également d'ajouter une validation si nécessaire, comme si vous ne contrôlez pas la source de données. La séparation des préoccupations facilite également le test de chaque couche indépendamment.
</ Mode didactique>
* Si vous avez besoin d'une résolution en nanosecondes dans votre modèle commercial, vous devrez utiliser une bibliothèque différente.
** Le format de chaîne d'horodatage peut varier d'une base de données à l'autre, je n'en suis pas sûr.