Convertir joda.temps.DateTime pour java.sql.Date et conserver fuseau horaire
J'ai le scénario suivant:
- De contrôle de Swing qui renvoie un
Calendar
objet - Intermédiaire
DateTime
objet que j'utilise pour faire lourd de la date/heure de manipulation (joda) - Connexion de base de données (
OraclePreparedStatement
) qui ne prendjava.sql.Date
objet
Mon problème est que le Calendar
et DateTime
les objets sont correctement l'affichage de la date en GMT (qui je veux), mais quand je convertir java.sql.Date
afin de les envoyer à la base de données, la date est convertie en le fuseau horaire local.
Par exemple:
Calendar
etDateTime
sont 2012-08-13T23:59:59.000 Z (GMT)- Résultant
java.sql.Date
est 2012-08-14 (local incorrect UTC+2 date)
Ci-dessous le code que j'utilise pour faire la conversion.
DateTime dateGmt = new DateTime(calendarGmt.getTimeInMillis(), DateTimeZone.UTC);
java.sql.Date sqlDate = new java.sql.Date(dateGmt.getMillis());
Je ne sais pas comment créer un java.sql.Date
objet tout en conservant le fuseau horaire correct. Il est également tout à fait possible que je suis en train de faire une conversion incorrecte.
OriginalL'auteur Justin Skiles | 2012-08-13
Vous devez vous connecter pour publier un commentaire.
Perdre De Temps
Un problème peut être que java.sql.Date sont censés être...
...selon la documentation. Cela signifie que le temps de la partie de la date-heure est en train d'être effacé de votre java.util.Date ou Joda-Time DateTime objets.
Pas De Temps Horaire
Comme le réponse correcte par Gilbert Le Blanc notes, à la fois à java.util.Date et java.sql.Ce jour n'ont pas de notion de temps de la zone interne. Ils stockent le nombre de millisecondes depuis le Unix époque.
Ces classes pull une vacherie: Leur
toString
méthodes s'appliquent à votre JVM du fuseau horaire par défaut pour le rendu de la chaîne. Très déroutant. LeDate
objet n'a pas de temps horaire, encore une fois affichée comme une chaîne de caractères que vous voyez un fuseau horaire.Si votre java.util.Date objet contient le nombre de 1344902399000L millisecondes écoulées depuis l'époque (début des années 1970), ce qui signifie
2012-08-13T23:59:59.000Z
en UTC/GMT. Mais si votre JVM croit être en France à l'Heure d'été (DST) en effet, vous allez voir 2 heures à l'avance de l'heure UTC/GMT:2012-08-14T01:59:59.000+02:00
décrite dans la catégorie " horrible format de chaîne de caractères. Le moment même de temps a autre jour du mois de la signification (13 vs 14) dans des fuseaux horaires différents, avec l'horloge-sur-le-mur-delà de minuit.Joda-Time À La Rescousse
La Joda-Time 2.4 bibliothèque peut être utile ici. Réussir à l'java.sql.Date ou java.util.Date objet d'un DateTime constructeur avec la Fuseau horaire UTC objet à obtenir une image claire de la valeur avec laquelle vous êtes en difficulté.
Lors de l'exécuter...
De convertir l'autre sens de Joda-Time java.util.Date de...
De convertir l'autre sens de Joda-Time java.sql.Date de...
Mise à jour java.temps
La Joda-Time projet est maintenant en mode de maintenance, avec l'équipe conseiller de la migration à la java.les classes de temps.
L'équivalent de
java.util.Date
estInstant
. LeInstantané
classe représente un moment dans le scénario de UTC avec une résolution de nanosecondes (jusqu'à neuf (9) chiffres d'une fraction décimale).Appliquer un fuseau horaire,
ZoneId
, pour produire unZonedDateTime
qui s'apparente à unjava.util.Calendar
et un Joda-TimeDateTime
.Maintenant extraire une date seule valeur, la date de la partie de l'
ZonedDateTime
, comme unLocalDate
. LeLocalDate
classe représente une date uniquement de la valeur, sans le temps de la journée et sans fuseau horaire. DoncLocalDate
est ce quejava.sql.Date
est de faire semblant d'être: une date seule valeur.Dans JDBC 4.2 et versions ultérieures, vous pouvez utiliser le java.temps directement avec un pilote compatible via
PreparedStatement::setObject
etResultSet::getObject
....et...
Pour un plus non-conformes pilote, convertir brièvement à une
java.sql.Date
objet à partir d'unLocalDate
en utilisant de nouvelles méthodes ajoutée à la vieille classe:toLocalDate
etvalueOf( LocalDate )
.Non, à partir d'un Joda-Time DateTime objet de java.util.Date est beaucoup plus facile que ça... il suffit d'appeler le
toDate
méthode. Comme ceci:java.util.Date date = myDateTime.toDate();
. Pour java.**sql**.Date, vous avez été proche, mais n'ont pas besoin de l'UTC comme Millis sont toujours UTC. Donc:java.sql.Date date = new java.sql.Date( myDateTime.getMillis() );
Mais quand je convertir java.sql.Date à partir de la base de données avec la valeur "2014-02-01" de cette façon puis-je obtenir "2014-01-31T23:00:00.000 Z" (mon fuseau horaire est GMT). Lorsque j'utilise le fuseau horaire HEC puis c'est correct: "2014-02-01T00:00:00.000 Z". Pourquoi est-ce?
Éviter ces trois lettres horaire des codes comme "CET". Utilisateur fuseau horaire nom. (b) Lors de l'analyse de la chaîne de type DateTime, passer le fuseau horaire pour encadrer le temps, sinon votre JVM par défaut est utilisé. Exemple:
DateTime dateTime = new DateTime( "2014-02-01", DateTimeZone.forID( "Europe/Berlin" ) );
→2014-02-01T00:00:00.000+01:00
(c) l'Allemagne est à 1 heure d'avance sur l'heure UTC. Donc, le premier moment de la journée 00:00:00 à Hanovre est 23:00:00 le jour précédent à l'UTC. Être "en avance" de l'UTC c'est le mouvement vers l'arrière à l'UTC.Que de travail. Merci beaucoup!
OriginalL'auteur Basil Bourque
La représentation interne d'un
java.sql.Date
est le nombre de millisecondes écoulées depuis le 1er janvier 1970 00:00:00.000 GMT.Êtes-vous sûr que vous n'êtes pas à la recherche à un
toString
problème? La méthodetoGMTString()
, bien que l'amorti, ce qui existe encore.OriginalL'auteur Gilbert Le Blanc
Je suppose que vous devrez peut-être ajouter dans le fichier de configuration du FUSEAU horaire=GMT
Dans l'application web elle est définie dans web.xml
Ce qui concerne
OriginalL'auteur Jåcob