Visualizzazione dei risultati da 1 a 10 su 10

Visualizzazione discussione

  1. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Infatti, credo che il problema sia la differenza tra il TimeZone utilizzato dalla tua JVM (che sarà quello di sistema, quindi immagino tarato sul TimeZone dell'Italia) e quello che tu hai specificato per il server (UTC, ovvero il TimeZone utilizzato dai paesi nel meridiano di Greenwich, che rispetto a noi sono sempre 1/2 ore indietro in base all'ora legale/solare).

    Documentandomi in giro, dovresti poter risolvere usando il setDate() di PreparedStatement da tre parametri, in questo modo:

    codice:
    ps.setDate(3, persona.getDataNascita(), Calendar.getInstance());

    Questo dovrebbe fornire al server il TimeZone in cui è espressa la data passata come argomento... costruendo, quindi, un oggetto Calendar in quel modo, viene di fatto istanziato un oggetto con il TimeZone di default della JVM su cui gira l'applicazione (che, appunto, dovrebbe essere quello dell'Italia). Attenzione, però, in lettura dei dati (non ho modo di provare ora), perchè potresti leggerli "sfasati".

    Prova e fammi sapere.


    Spiego quello che succede: nella connection string hai specificato useLegacyDatetimeCode=false e serverTimeZone=UTC. La combinazione di questi due fa sì che i metodi che trattano dati temporali (date / time / datetime / timestamp / ecc) vengano "normalizzati" dal driver JDBC quando vengono spediti al server (o letti dal server). Quindi, tu hai la tua JVM che funziona con TimeZone locale dell'Italia (ora siamo a UTC+1) e hai istruito il driver JDBC affinchè non utilizzi i dati temporali in modo legacy (quindi deve applicare le normalizzazioni) e gli hai detto che il server è in TimeZone UTC. Il driver, quando riceve la richiesta di memorizzare sul server MySQL un dato temporale lo allinea al TimeZone del server (quindi, nel tuo caso, toglie 1 ora) e glielo passa. Se invece riceve una richiesta di lettura di un dato temporale, effettua l'operazione opposta: sa che sta leggendo da un server che memorizza i dati in UTC e li trasla al TimeZone della JVM che li sta richiedendo (quindi, nel tuo caso, aggiunge 1 ora al dato di MySQL). In questo modo, tu scrivi e leggi sempre il dato corretto (se lo fai tramite Java)... ma se vai in console su MySQL ti trovi il dato sfasato.

    PS: faccio notare che se il server gira sulla tua macchina (o, comunque, è qui in Italia) sei tu che stai dando al driver JDBC un'informazione falsa dicendogli che il server lavora in UTC...

    Ciao.
    Ultima modifica di LeleFT; 11-03-2019 a 19:13
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.