tl;dr
myPreparedStatement
.setObject(
… , // Specify which placeholder `?` in your SQL statement.
OffsetDateTime.now( ZoneOffset.UTC ) // Capture the current moment as seen in the wall-clock time of UTC (an offset-from-UTC of zero).
) ;
Vermijd verouderde datum-tijdklassen
Je gebruikt vreselijke datum-tijdklassen die jaren geleden werden verdrongen door de java.time klassen.
Gebruik nooit Date
of Timestamp
.
UTC
Leg het huidige moment vast in UTC. De meeste databases slaan een moment op in UTC. En over het algemeen zou u het grootste deel van uw bedrijfslogica, foutopsporing, logboekregistratie, opslag en gegevensuitwisseling in UTC moeten doen.
OffsetDateTime
Geef een moment weer met een offset-van-UTC met de toepasselijke naam OffsetDateTime
klas.
We willen UTC zelf, of een offset van nul. We kunnen daarvoor een constante gebruiken, ZoneOffset.UTC
.
OffsetDateTime odt = OffsetDateTime.now( ZoneOffset.UTC ) ) ;
JDBC 4.2
Vanaf JDBC 4.2 kunnen we java.time direct uitwisselen objecten met de database.
Om dit moment op te slaan in een kolom van een gegevenstype vergelijkbaar met de SQL-standaard TIMESTAMP WITH TIME ZONE
:
myPreparedStatement.setObject( … , odt ) ;
Ophalen:
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
ZonedDateTime
Om dit opgehaalde moment aan de gebruiker te presenteren, kunt u zich aanpassen aan de verwachte/gewenste tijdzone van de gebruiker.
ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = odt.atZoneSameInstant( z ) ;
Vertrouw nooit op de standaardtijdzone
Merk in de bovenstaande code op dat we altijd de gewenste/verwachte offset of zone hebben opgegeven.
Als u niets opgeeft, wordt een offset of zone stilzwijgend toegepast. Het is beter om uw bedoelingen expliciet te specificeren, aangezien de huidige standaard van uw JVM, database en host-besturingssysteem allemaal uit uw handen zijn als programmeur. Wat betekent dat code die afhankelijk is van de standaard, tijdens runtime in gedrag zal variëren.
Java 6 &7
Dezelfde man, Stephen Colebourne, die JSR 310 en de java.time leidt implementatie, evenals de beroemde Joda-Time project, leidt ook een ander project, ThreeTen-Backport . De meeste java.time functionaliteit wordt terug geport naar Java 6 &7 in deze bibliotheek, met bijna identieke API.
Dus doe al je werk in back-port klassen. Converteer vervolgens op het laatste moment naar/van java.sql.Timestamp
via de DateTimeUtils
klas.
Die conversiemethoden gebruiken meestal Instant
voorwerpen. Een Instant
is een moment in UTC, altijd in UTC. U kunt aanpassen vanaf uw OffsetDateTime
naar UTC door een Instant
. te extraheren . Het Instant
class is de basisbouwsteenklasse in java.time , met OffsetDateDate
met meer flexibiliteit, zoals alternatieve opmaakpatronen bij het genereren van een string. Maar beide Instant
en OffsetDateTime
staat voor een moment, een punt op de tijdlijn.
Instant instant = odt.toInstant() ;
java.sql.Timestamp ts = org.threeten.bp.DateTimeUtils.toSqlTimestamp( instant ) ;
De andere kant op gaan, een Timestamp
ophalen uit uw database en vervolgens onmiddellijk converteren naar een Instant
.
java.sql.Timestamp ts = myResultSet.getTimestamp( … ) ;
Instant instant = org.threeten.bp.DateTimeUtils.toInstant( ts ) ;
Over java.time
De java.time
framework is ingebouwd in Java 8 en hoger. Deze klassen vervangen de lastige oude legacy
date-time klassen zoals java.util.Date
, Calendar
, &SimpleDateFormat
.
De Joda-Time project, nu in onderhoudsmodus , adviseert migratie naar de java.time lessen.
Zie voor meer informatie de Oracle-zelfstudie . En zoek Stack Overflow voor veel voorbeelden en uitleg. Specificatie is JSR 310 .
Je mag java.time ruilen objecten rechtstreeks met uw database. Gebruik een JDBC-stuurprogramma
voldoet aan JDBC 4.2
of later. Geen strings nodig, geen java.sql.*
lessen.
Waar zijn de java.time-klassen te verkrijgen?
- Java SE 8
, Java SE 9
, Java SE 10
, Java SE 11
, en later - Onderdeel van de standaard Java API met een gebundelde implementatie.
- Java 9 voegt enkele kleine functies en oplossingen toe.
- Java SE 6
en Java SE 7
- De meeste java.time functionaliteit is teruggezet naar Java 6 &7 in ThreeTen-Backport .
- Android
- Latere versies van Android-bundelimplementaties van de java.time lessen.
- Voor eerdere Android (<26), de ThreeTenABP project past ThreeTen-Backport aan (hierboven vermeld). Zie Hoe ThreeTenABP te gebruiken… .
De ThreeTen-Extra
project breidt java.time uit met extra klassen. Dit project is een proeftuin voor mogelijke toekomstige toevoegingen aan java.time. Mogelijk vindt u hier enkele nuttige klassen, zoals Interval
, YearWeek
, YearQuarter
, en meer
.