sql >> Database >  >> RDS >> Mysql

Java Date en MySQL tijdstempel tijdzones

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?

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 .




  1. Windows Azure VM-prestaties vergelijken, deel 1

  2. Hoe datatable doorgeven als invoer voor procedure in C #?

  3. Traceervlag 2389 en de nieuwe kardinaliteitsschatter

  4. laravel mysql-query met meerdere waar orwhere en inner join