Créer un Timestamp sans fuseau horaire
Comment puis-je créer un java.sql.timestamp
sans fuseau horaire (im obtenir 2007-09-23T10:10:10Z
et je fais semblant de 2007-09-23T10:10:10
).
J'essaie:
Timestamp timestamp = Timestamp.valueOf("2007-09-23 10:10:10");
mais en debug, j'ai vu que la fonction cdate est 2007-09-23T10:10:10.000+0100
au lieu de 2007-09-23T10:10:10
OriginalL'auteur JMarques | 2011-12-28
Vous devez vous connecter pour publier un commentaire.
Un Timestamp ne dispose pas d'un fuseau horaire. Lors de l'affichage de l'horodatage comme une Chaîne de caractères, il affiche un temps et évoque le fuseau horaire, car sinon on ne pouvait pas savoir l'heure qu'il représente. Et il choisit d'utiliser le fuseau horaire par défaut (le vôtre), car c'est celui dont vous êtes le plus familier avec.
Dire, il est 12:00:00 ne veut rien dire. Dire que c'est 12:00:00 dans votre fuseau horaire signifie quelque chose. Mais le timestamp contient seulement un instant dans le temps. Vous pouvez afficher cette instant dans le temps dans n'importe quel fuseau horaire vous souhaitez l'aide d'un DateFormat.
Remarque:
Timestamp.valueOf("2010-10-23 12:05:16");
signifie "créer un horodatage avec le temps dans le fuseau horaire par défaut".Utiliser un DateFormat, définir son fuseau horaire et le modèle de celles que vous voulez, analyse de votre Chaîne de date/heure, et instancier le Timestamp avec les millisecondes à partir de la Date. Pour afficher l'horodatage, instancier un DateFormat, définir son fuseau horaire et le modèle de celles que vous voulez, et le format de l'horodatage.
OriginalL'auteur JB Nizet
tl;dr
Non, vous ne pouvez pas. La mauvaise classe. Utilisation
java.time.LocalDateTime
à la place.Détails
Un
java.sql.Timestamp
est pas la classe à utiliser. Il représente un moment dans l'UTC avec une résolution de nanosecondes.Si vous voulez une date avec l'heure de la journée, indépendamment de la zone de temps ou de décalage-de-UTC (donc, pas un moment), utiliser une autre classe qui est apte à l'usage prévu.
Par le chemin... la
java.sql.Timestamp
est une terrible vieille classe mal conçu, et a été supplanté ans par la classejava.time.Instant
(toujours en UTC) ou bienjava.time.OffsetDateTime
si la valeur de décalage de l'heure UTC.LocalDateTime
La bonne classe pour une date avec l'heure de la journée, sans aucune notion de temps horaire et le décalage de l'heure UTC est
LocalDateTime
.Comme indiqué ci-dessus, cela signifie que cette classe est pas un moment, pas un point sur la timeline, et devrait pas être utilisé pour le suivi des points de temps lors d'un événement qui s'est passé dans un certain lieu.
TIMESTAMP WITHOUT TIME ZONE
Dans un SQL conformes à la norme de base de données tels que Postgres, utiliser une colonne de type de données
TIMESTAMP WITHOUT TIME ZONE
(pas leWITH
type).Et...
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.OriginalL'auteur Basil Bourque