Mysql
 sql >> Database >  >> RDS >> Mysql

I campi Jooq LocalDateTime utilizzano il fuso orario del sistema invece del fuso orario della sessione

Di recente ho scoperto che, a seconda del driver del database utilizzato, jOOQ può mostrare uno strano comportamento nell'analisi di DateTime. jOOQ restituisce la data e l'ora di offset come Z (UTC) anche se non lo è

In particolare, nel mio caso, l'utilizzo di un driver Postgres diverso ha comportato che DefaultBinding.java ricevesse un oggetto calendario con un timestamp, ma chiamava toString su di esso per analizzarlo. Si scopre che toString non stampa il fuso orario, quindi jOOQ ha dedotto che era nell'ora locale.

Per me, le righe offensive in DefaultBinding.java (stavo usando un timestamp con fuso orario) erano:

else if (type == OffsetDateTime.class) {
    result = (T) offsetDateTime(ctx.resultSet().getString(ctx.index()));
}

Potresti trovarti su una riga diversa in quella serie di altri se in base al fatto che non hai un fuso orario.

Durante i miei test, ho anche scoperto che la modifica dell'ora di sistema ha modificato il risultato, ma la modifica dell'ora della sessione non ha fatto nulla.

Fortunatamente per me, il passaggio al driver Postgres standard ha risolto il problema. In caso contrario, avrei cercato di sovraccaricare l'associazione per OffsetDateTime per correggere l'uso di toString e la rimozione associata del fuso orario pertinente. Potrebbe essere necessario seguire quel percorso, sfortunatamente, a meno che anche tu non stia utilizzando un driver SQL che potrebbe essere aggiornato o sostituito. Oppure puoi memorizzarlo con un fuso orario e quindi convertirlo nel fuso orario desiderato quando carichi dal database.