J'utilise JodaTime 1.6.2.
J'ai un LocalDate
que je dois convertir en un (Joda) LocalDateTime
, ou un java.sqlTimestamp
pour ormapping.
La raison en est que j'ai compris comment convertir entre a LocalDateTime
et a java.sql.Timestamp
:
LocalDateTime ldt = new LocalDateTime();
DateTimeFormatter dtf = DateTimeFormatter.forPattern("yyyy-MM-dd HH:mm:ss");
Timestamp ts = Timestamp.valueOf(ldt.toString(dtf));
Donc, si je peux simplement convertir entre LocalDate
et LocalDateTime
, alors je peux continuer la conversion en java.sql.Timestamp
. Merci pour tout coup de pouce dans la bonne direction!
java.sql.Timestamp
classe est désormais héritée, supplantée par les classes java.time , en particulier parInstant
.Réponses:
JodaTime
Pour convertir JodaTime
org.joda.time.LocalDate
enjava.sql.Timestamp
, faites simplementPour convertir JodaTime
org.joda.time.LocalDateTime
enjava.sql.Timestamp
, faites simplementJavaTime
Pour convertir Java8
java.time.LocalDate
enjava.sql.Timestamp
, faites simplementPour convertir Java8
java.time.LocalDateTime
enjava.sql.Timestamp
, faites simplementla source
LocalDateTime
enDateTime
car tous lesLocalDateTime
s ne sont pas validesDateTime
. Source: joda-time.sourceforge.net/faq.html#illegalinstant et je suis juste en train de rencontrer ça.Timestamp#valueOf()
méthode accepte depuis Java SE 1.8 également unLocalDateTime
.La meilleure façon d'utiliser l'API de temps Java 8:
Pour une utilisation avec JPA mis en place avec votre modèle ( https://weblogs.java.net/blog/montanajava/archive/2014/06/17/using-java-8-datetime-classes-jpa ):
Alors maintenant, c'est l'heure relative indépendante du fuseau horaire. De plus, il est facile de faire:
Mise en page:
MISE À JOUR: postgres 9.4.1208, HSQLDB 2.4.0 etc comprennent Java 8 Time API sans aucune conversation!
la source
tl; dr
Le projet Joda-Time est en mode maintenance, désormais supplanté par les classes java.time .
java.time.Instant
classe.LocalDateTime
java.sql.Timestamp
Capturez le moment actuel en UTC.
Pour stocker ce moment dans la base de données:
Pour récupérer ce moment de la base de données:
Pour ajuster l'heure de l'horloge murale à celle d'un fuseau horaire particulier.
LocalDateTime
est la mauvaise classeD'autres réponses sont correctes, mais elles ne précisent pas que ce
LocalDateTime
n'est pas la bonne classe pour votre objectif.Dans java.time et Joda-Time , il
LocalDateTime
manque volontairement tout concept de fuseau horaire ou de décalage par rapport à UTC. En tant que tel, il ne représente pas un moment et n'est pas un point sur la chronologie. ALocalDateTime
représente une idée approximative des moments potentiels sur une plage d'environ 26 à 27 heures.Utilisez a
LocalDateTime
pour lorsque la zone / décalage est inconnu (ce n'est pas une bonne situation), ou lorsque le décalage de zone est indéterminé. Par exemple, «Noël commence au premier moment du 25 décembre 2018» serait représenté par unLocalDateTime
.Utilisez a
ZonedDateTime
pour représenter un moment dans un fuseau horaire particulier. Par exemple, Noël commençant dans une zone particulière telle quePacific/Auckland
ouAmerica/Montreal
serait représenté avec unZonedDateTime
objet.Pour un moment toujours en UTC, utilisez
Instant
.Appliquer un fuseau horaire. Même moment, même point sur la chronologie, mais vu avec une heure d'horloge murale différente.
Non, mauvaise stratégie. Si vous avez une valeur de date uniquement et que vous souhaitez une valeur de date-heure, vous devez spécifier une heure. Cette heure du jour peut ne pas être valide à cette date pour une zone particulière - auquel cas la
ZonedDateTime
classe ajuste automatiquement l'heure au besoin.Si vous voulez que le premier moment de la journée soit votre heure de la journée, laissez java.time déterminer ce moment. Ne supposez pas que la journée commence à 00h00. Des anomalies telles que l'heure d'été (DST) signifient que la journée peut commencer à une autre heure telle que 01:00:00.
java.sql.Timestamp
est la mauvaise classeLe
java.sql.Timestamp
fait partie des anciennes classes de date-heure gênantes qui sont maintenant héritées, entièrement supplantées par les classes java.time . Cette classe était utilisée pour représenter un moment en UTC avec une résolution de nanosecondes . Cet objectif est maintenant atteintjava.time.Instant
.JDBC 4.2 avec
getObject
/setObject
À partir de JDBC 4.2 et versions ultérieures, votre pilote JDBC peut directement échanger des objets java.time avec la base de données en appelant:
PreparedStatement::setObject
ResultSet::getObject
Par exemple:
… et …
Convertir l'héritage ⬌ moderne
Si vous devez vous connecter avec un ancien code qui n'a pas encore été mis à jour vers java.time , effectuez une conversion en arrière en utilisant de nouvelles méthodes ajoutées aux anciennes classes.
…et…
À propos de java.time
Le framework java.time est intégré à Java 8 et versions ultérieures. Ces classes supplantent les anciens gênants hérités des classes date-heure tels que
java.util.Date
,Calendar
, etSimpleDateFormat
.Le projet Joda-Time , désormais en mode maintenance , conseille la migration vers les classes java.time .
Pour en savoir plus, consultez le didacticiel Oracle . Et recherchez Stack Overflow pour de nombreux exemples et explications. La spécification est JSR 310 .
Vous pouvez échanger des objets java.time directement avec votre base de données. Utilisez un pilote JDBC compatible avec JDBC 4.2 ou version ultérieure. Pas besoin de chaînes, pas besoin de
java.sql.*
classes.Où obtenir les classes java.time?
Le projet ThreeTen-Extra étend java.time avec des classes supplémentaires. Ce projet est un terrain d'essai pour d'éventuels futurs ajouts à java.time. Vous trouverez peut - être des classes utiles ici, comme
Interval
,YearWeek
,YearQuarter
et plus .la source
En fonction de votre fuseau horaire, vous pouvez perdre quelques minutes (1650-01-01 00:00:00 devient 1649-12-31 23:52:58)
Utilisez le code suivant pour éviter cela
la source
Depuis Joda est se fanée, quelqu'un pourrait vouloir convertir
LocaltDate
àLocalDateTime
Java 8. En Java 8 ,LocalDateTime
il donnera un moyen de créer uneLocalDateTime
instance à l' aide d' unLocalDate
etLocalTime
. Vérifiez ici.L'échantillon serait,
Juste pour référence, pour obtenir les secondes d'époque ci-dessous peuvent être utilisées,
la source
LocalDateTime
du tout ici. Cette classe n'a volontairement aucun concept de fuseau horaire ou de décalage par rapport à UTC. Cela ne sert donc à rien ici. Au lieu de cela:LocalDate.parse( “20180306” , DateTimeFormatter.BASIC_ISO_DATE ).atStartOfDay( ZoneId.of( “Africa/Tunis” ).toEpochSecond()
ne supposez pas que la journée commence à 00h00, ce n'est pas toujours le cas.java.time.LocalDate.atStartOfDay
pour obtenir unZonedDateTime
. Voir des exemples dans ma réponse . Comme je l'ai dit, laLocalDateTime
classe est inutile et contre-productive dans tout cela.LocalDateTime
nous devons utiliser unZoneId
?LocalDateTime
n'est pas approprié au problème à l'étude ici. ALocalDateTime
ne représente pas un moment. ALocalDateTime
n'a rien à voir avec une localité ou un fuseau horaire particulier, bien que le nom puisse impliquer le contraire à première vue - en savoir plus sur l'intention et les détails de cette classe. LaLocalDateTime
classe sert un but, mais pas le but vu dans cette Question.l'appel de fonction
asStartOfDay()
sur unjava.time.LocalDate
objet renvoie unjava.time.LocalDateTime
objetla source
Java8 +
la source