Java Date et l'Horodatage de l'instance de ZonedDateTime UTC
J'ai une application java dans lequel je voudrais que le temps UTC. Actuellement, le code utilise un mélange de java.util.Date
et java.sql.Timestamp
. Pour obtenir l'heure en UTC, le programmeur avant de me servir:
Pour Date:
Date.from(ZonedDateTime.now(ZoneOffset.UTC)).toInstant();
Pour Timestamp:
Timestamp.from(ZonedDateTime.now(ZoneOffset.UTC).toInstant());
Toutefois, j'ai exécuter plusieurs tests moi-même avec ce code et ces deux lignes de retourner la date/heure actuelle(dans mon fuseau horaire actuel). De tout ce que j'ai lu il apparaît que l'Horodatage n'est pas un écartfuseau valeur, mais je ne trouve pas une déclaration de béton de cette.
Est-il de toute façon à maintenir le fuseau horaire (UTC) au sein de la Date ou Timestamp objets, ou dois-je besoin de faire un peu de refactoring et de l'utilisation de la réelle ZonedDateTime objet tout au long de ma demande? Aussi sera-ce ZonedDateTime objet compatible avec le Timestamp actuel de l'objet pour sql?
Exemple:
public static void main (String args[])
{
ZonedDateTime zonedDateTime = ZonedDateTime.now(ZoneOffset.UTC);
Timestamp timestamp = Timestamp.from(ZonedDateTime.now(ZoneOffset.UTC).toInstant());
Date date = Date.from(ZonedDateTime.now(ZoneOffset.UTC).toInstant());
System.out.println("ZonedDateTime: " + zonedDateTime);
System.out.println("Timestamp: " + timestamp);
System.out.println("Date: " + date);
}
De sortie:
ZonedDateTime: 2017-04-06T15:46:33.099Z
Timestamp: 2017-04-06 10:46:33.109
Date: Thu Apr 06 10:46:33 CDT 2017
toString()
sur java.util.Date
de conclure que, mais cette méthode utilise uniquement externe fuseau horaire par défaut pour imprimer lui-même. Le décalage ou le fuseau horaire n'est jamais une partie de java.util.Date
, et de son véritable état est plutôt traduit par la méthode getTime()
. Merci donc de clarifier ce que vous avez vraiment fait.La Date et l'Horodatage à la fois stocker l'heure en GMT. La commutation de la zone de temps ne change la valeur d'affichage.
Il n'y a pas de logique de la différence entre
Date.from(ZonedDateTime.now(ZoneOffset.UTC).toInstant())
et new Date()
. À l'exception de l'ancien est beaucoup plus confuse.Normalement, je ne recommanderais pas à la recherche à la source, une classe de comportement est défini par son contrat (javadoc), mais aussi de Java 8, la source de java.util.Date, montre qu'il n'a que deux champs d'instance: une valeur de type long et un " BaseCalendar’ objet utilisé uniquement par maintenant-des méthodes obsolètes (qui date d'une époque où le Calendrier de la classe n'existait pas et la classe Date a été d'essayer de fournir tous les de calendrier liées à la fonctionnalité). Il vient de encapsule une valeur en millisecondes; il ne conserve aucune informations de fuseau horaire.
OriginalL'auteur DevelopingDeveloper | 2017-04-06
Vous devez vous connecter pour publier un commentaire.
tl;dr
Utiliser uniquement java.temps classes. Éviter le gênants ancien héritage de date-heure classes ajouté avant Java 8.
À l'aide de java.temps
Le programmeur avant a été prise de l'utilisation de la nouvelle moderne java.les classes de temps que maintenant supplanter le notoirement gênants ancien héritage de date-heure classes telles que
Date
,Calendar
,Timestamp
.Instant
La
Instantané
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). Pour obtenir l'heure actuelle, à l'heure UTC est tout à fait simple:Instant.now
.Conversion
Vous devez vous en tenir à la java.les classes de temps, et d'éviter les classes héritées. Mais si c'est absolument nécessaire, comme par exemple l'interfaçage avec l'ancien code pas encore mis à jour pour java.temps, vous pouvez convertir vers/à partir de java.temps. Regarder vers de nouvelles méthodes sur les anciennes classes. L'héritage de la classe
java.util.Date
équivalent estInstant
.JDBC
Éviter l'héritage de date-heure classes. L'utilisation de java.les classes de temps à la place.
Votre JDBC 4.2 conforme pilote peut être en mesure de s'attaquer directement à java.les types d'heures en appelant
PreparedStatement::setObject
etResultSet::getObject
.... et ...
Si non, revenir à l'aide de java.les types sql, mais aussi brièvement que possible. L'utilisation de nouvelles méthodes de conversion ajouté des anciennes classes.
... et ...
Pas besoin de
ZonedDateTime
Avis que nous n'avions pas besoin de votre mentionné
ZonedDateTime
comme vous l'avez dit vous étaient seulement intéressés à l'UTC. LeInstant
les objets sont toujours en UTC. Cela signifie que le code d'origine que vous avez cité:...aurait pu être simplement réduit à:
Noter que
java.util.Date
est toujours en UTC. Cependant, sontoString
malheureusement s'applique la JVM actuelle fuseau horaire par défaut implicitement, tout en générant de la Chaîne. Cette anti-fonction crée pas de confusion comme vous pouvez le voir en faisant une recherche sur un Débordement de Pile.Si vous voulez voir votre
Instant
objet de l'UTC de la valeur à travers la lentille d'une région horloge murale, attribuer un fuseau horaireZoneId
pour obtenir unZoneDateTime
.Spécifier un fuseau horaire nom dans le format de
continent/region
, commeAmerica/Montreal
,Africa/Casablanca
, ouPacific/Auckland
. Ne jamais utiliser de l'3-4 abréviation commeCDT
ouEST
ouIST
comme ils sont pas vrai fuseaux horaires, pas normalisée, et même pas unique(!).Sur java.temps
La java.temps cadre est intégré dans Java 8 et les versions ultérieures. Ces classes permettent d'éviter la pénible vieux héritage date du temps des classes comme
java.util.Date
,Agenda
, &SimpleDateFormat
.La Joda-Time projet, maintenant dans le mode de maintenance, conseille la migration vers le java.le temps classes.
Pour en savoir plus, consultez les Oracle Tutoriel. Et de recherche de Débordement de Pile pour de nombreux exemples et des explications. La spécification est JSR 310.
Vous pouvez échanger java.temps objets directement avec votre base de données. Utiliser un Pilote JDBC compatible avec JDBC 4.2 ou plus tard. Pas besoin de chaînes, pas besoin de
java.sql.*
classes.Où obtenir le java.les classes de temps?
La ThreeTen-Extra projet s'étend java.temps avec d'autres classes. Ce projet est un terrain d'essai pour de possibles futurs ajouts à java.temps. Vous pouvez trouver quelques classes utiles ici comme
Intervalle
,YearWeek
,YearQuarter
, et plus.setObject()
au lieu d'utiliser lejava.sql
typetimestamp
?Parce que
Timestamp
est une abomination de la mauvaise conception de Classe. Le java.temps framework a été conçu et adopté par Sun, Oracle, et le PCM pour remplacer entièrement l'héritage de date-heure classes. L'un des principaux points de JDBC 4.2 mise à jour de cette transition à la modernité de l' java.temps classes.Comment
setObject
se comporte sur ce point? Il va sauver monZonedDateTime
comme un blob? Vais-je être en mesure d'exécuter des requêtes sur les données enregistrées sur la base de données? Cela fonctionne pour tous lesjava.time
valeursInstant
etPeriod
?Je suis actuellement en utilisant
Timestamp
à partir d'unInstant
et tous lesTIMESTAMP
données sur ma base de données MySQL est en UTC et je peux le rechercher et de le lire facilement, de quoi vais-je perdre?Comme de JDBC 4.2, pas besoin de jamais toucher le
java.sql.Timestamp
classe, ni à toute autre date-heure de classe correspondant à l'extérieur de la java.temps package. Je suis une Postgres genre de gars, mais apparemment leTIMESTAMP
type de données dans MySQL représente un moment dans l'UTC, et s'apparente à du SQL standard typeTIMESTAMP WITH TIME ZONE
. Par conséquent, vous devez utiliserjava.time.Instant
pour l'échange de valeurs avec les colonnes de ce type. Si vous avez unZonedDateTime
objet, il suffit d'appeler sontoInstant
méthode de converser avec votre base de données par l'intermédiaire de votre pilote JDBC. Après la récupération, appelInstant::atZone
.OriginalL'auteur Basil Bourque
En Java,
Date
représente un point dans le temps. Il n'est pas lié à l'horodatage. Lorsque vous appeleztoString()
méthode deDate
objet, il la convertit en temps à la Plate-forme par défaut d'Horodatage, par exemple, Suivant apparaîtra à l'impression de la date/de l'heure UTC (il met par défaut le fuseau horaire UTC):OriginalL'auteur Darshan Mehta
J'ai créé le SimpleJdbcUpdate classe indiquée ci-dessous:
OriginalL'auteur Umesh Rajbhandari