Question

J'ai un déclaration préparée

INSERT INTO mst(time) VALUES (?);

où le temps est de type Horodatage en a base de données PostgreSQL .
Je suis un Joda-Time l'objet de DateTime, ou devrais-je dire que je suis en train de. Je ne trouve aucun moyen de convertir l'objet DateTime en java .sql.Timestamp. J'ai lu Joda Time-docs et voir aucune référence à ce sujet.

Merci.

Était-ce utile?

La solution

Vous pouvez convertir un Joda DateTime à une longue (Millisecondes depuis l'époque) d'abord, puis créer un Horodatage de cela.

DateTime dateTime = new DateTime();
Timestamp timeStamp = new Timestamp(dateTime.getMillis());

Autres conseils

constructeur DateTime de JodaTime peut gérer pour vous maintenant. (Je ne sais pas si cela était vrai lorsque la question a été publiée, mais il est un meilleur résultat Google Je pensais que je serais donc ajouter une solution plus récente.)

Il y a quelques options API:

public DateTime(Object instant);
public DateTime(Object instant, DateTimeZone zone);

Les deux options acceptent java.sql.Timestamp parce qu'il étend java.util.Date, mais les nanosecondes seront ignorés (parqueté), parce que DateTime et la date n'ont une résolution de milliseconde *. Sans un fuseau horaire spécifique, il sera par défaut DateTimeZone.UTC.


« Résolution » est de savoir comment sont fournis de chiffres. « Précision » est la façon dont la représentation est exacte. Par exemple, DateTime MSSQL a une résolution de milliseconde, mais seulement environ 1/3 de seconde précision (DateTime2 a une résolution variable et une plus grande précision).

UTC Horodatage avec milliseconde résolution Exemple:

new DateTime(resultSet.getTimestamp(1));

Si vous utilisez TIMESTAMP AVEC TIME ZONE dans votre base de données, vous ne pouvez pas utiliser java.sql.Timestamp, car il ne supporte pas les fuseaux horaires. Vous devez utiliser ResultSet # getString et analyser la chaîne.

Horodatage sans fuseau horaire avec Second exemple la résolution **:

LocalDateTime dt = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss")
    .parseLocalDateTime(resultSet.getString(1));

UTC Horodatage avec Deuxième résolution Exemple **:

DateTime dt = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss")
    .parseDateTime(resultSet.getString(1));

timestamp with time zone avec Deuxième résolution Exemple (format offset) **:

DateTime dt = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss Z")
    .parseDateTime(resultSet.getString(1));

Bonus: DateTimeFormat # forPattern caches statiquement par parseurs modèle afin que vous ne devez pas

.


Je recommande généralement à l'aide d'une chaîne dans votre modèle afin de SBO rendre la résolution explicite et éviter de générer des objets intermédiaires. (Est-14/11/2013 09:55:25 égal à 09 14/11/2013: 55: 25,000) J'essaie généralement de faire la distinction entre les « objets du modèle de base de données » optimisation pour les problèmes de conservation des données et des « objets du modèle d'affaires » pour l'optimisation l'utilisation du niveau de service d'une couche de transformation / mappage entre les deux. Je trouve avoir des objets d'affaires générant OTI à base CRUD tend directement à mélanger les priorités et optimiser pour, ni lancer des exceptions de lieux inattendus en raison des cas de pointe manqués. Avoir une couche de transformation explicite vous permet également d'ajouter la validation si nécessaire, comme si vous ne contrôlez pas la source de données. La séparation des préoccupations rend également plus facile de tester de façon indépendante chaque couche.

* Si vous devez résoudre la résolution nanoseconde dans votre modèle d'entreprise, vous devrez utiliser une autre bibliothèque.

** Horodatage format de chaîne peut varier entre les bases de données, pas sûr.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top