MySQL JDBC Driver 5.1.33 - Masalah Zona Waktu

360

Beberapa latar belakang:

Saya memiliki webapp Java 1.6 yang berjalan di Tomcat 7. Basis datanya adalah MySQL 5.5. Sebelumnya, saya menggunakan driver Mysql JDBC 5.1.23 untuk terhubung ke DB. Semuanya berhasil. Saya baru-baru ini ditingkatkan ke driver Mysql JDBC 5.1.33. Setelah peningkatan, Tomcat akan melempar kesalahan ini ketika memulai aplikasi.

WARNING: Unexpected exception resolving reference
java.sql.SQLException: The server timezone value 'UTC' is unrecognized or represents more than one timezone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc timezone value if you want to utilize timezone support.

Mengapa ini terjadi?

bluecollarcoder
sumber
1
Seperti apa URL JDBC Anda?
David Levesque
Periksa jawaban saya stackoverflow.com/a/44720416/4592448 . Saya pikir jawaban terbaiknya)
Fortran

Jawaban:

674

Rupanya, untuk mendapatkan versi 5.1.33 dari driver MySQL JDBC untuk bekerja dengan zona waktu UTC, kita harus menentukan serverTimezonesecara eksplisit dalam string koneksi.

jdbc:mysql://localhost/db?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
bluecollarcoder
sumber
4
Menurut dokumen, useJDBCCompliantTimezoneShift tidak berpengaruh ketika menggunakan useLegacyDatetimeCode = false. Karena itu tidak diperlukan di sana ...
matof
24
Ini menyelesaikan kesalahan saya. Catatan tambahan, lepas dari & dengan & amp; dalam file persistence.xml: <properti name = "javax.persistence.jdbc.url" value = "jdbc: mysql: // localhost / test? useUnicode = true & use; useJDBCCompliantTimezoneShift = true & amp; useLegacyDatetimeCode = false & amp; server = UTC / serverTzone>
pdem
5
Itu tidak benar. Titik useLegacyDatetimeCode = false tidak harus menentukan serverTimezone sehingga klien mengoreksi perbedaan zona waktu. Ini bug dalam versi klien MySQL itu.
antgar9
2
Solusi ini merusak zona waktu kecuali untuk GMT. Saya pikir solusi yang tepat diremehkan di bawah ini
DuncanSungWKim
1
solusi bekerja dengan 8.0.17. Terjadi dengan instalasi MySQL baru. Tidak dapat percaya bahwa bug ini belum diperbaiki setelah bertahun-tahun.
Tilman Hausherr
101

Saya telah memecahkan masalah ini dengan mengkonfigurasi MySQL.

SET GLOBAL time_zone = '+3:00';

Dmitriy Rud
sumber
6
jika Anda menggunakan MSK zona waktu itu 3, maka Anda mungkin menggunakan folowing sebagai alamat db: jdbc:mysql://localhost/db?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Europe/Moscow. Sepertinya mysql-connector tidak mengerti nama zona waktu pendek.
babay
2
Apa yang Anda lakukan ketika Daylight Savings Time mengubah jam?
isapir
3
Dengan mysql 8.0 Anda dapat memanggil "set persist time_zone = '+00: 00';" untuk mengaturnya ke UTC secara terus-menerus, tanpa perlu mengedit my.cnf atau me-restart server. Lihat mysqlserverteam.com/…
ccleve
Jika Anda mengatur ini melalui kueri SQL manual yang unik, pengaturan ini akan kembali ke nilai aslinya setelah DB restart.
CBA110
tidak berfungsi - ingatlah untuk memodifikasi string zona waktu lokal Anda di tempat +3 SET GLOBAL time_zone = '+3: 00';
Pravin
61

Setelah membaca beberapa posting tentang topik ini, menguji berbagai konfigurasi dan berdasarkan pada beberapa wawasan dari utas bug mysql ini, itulah yang saya mengerti:

  • zona waktu server penting khususnya untuk mengonversi tanggal yang disimpan dalam database ke zona waktu server aplikasi. ada implikasi lain tetapi ini adalah yang paling terlihat
  • GMT x sistem zona waktu UTC. GMT dikandung pada akhir abad ke-19 dan dapat digeser antara waktu standar dan waktu musim panas. properti ini dapat menyebabkan situasi di mana server database bergeser ke waktu musim panas dan aplikasi tidak menyadarinya (mungkin ada komplikasi lain tetapi saya tidak melakukan riset lebih lanjut). UTC tidak berbeda dari waktu ke waktu (selalu dalam waktu sekitar 1 detik dari waktu matahari rata-rata pada 0 ° bujur).
  • definisi serverTimeZone diperkenalkan pada konektor jsb mysql versi 5.1 di depan. sampai versi 8 itu dapat diabaikan useLegacyDatetimeCode=true, yang bersamaan dengan useJDBCCompliantTimezoneShift=trueakan membuat aplikasi mendapatkan zona waktu basis data pada setiap koneksi. Dalam mode ini, zona waktu GMT seperti 'Waktu Musim Panas Inggris' akan dikonversi ke format java / JDBC internal. Zona waktu baru dapat didefinisikan dalam file .properties seperti ini
  • Dimulai dengan driver jdbc versi 8, pencocokan waktu otomatis ( useJDBCCompliantTimezoneShift) dan format waktu lama ( useLegacyDatetimeCode) dihapus ( lihat mysql jdbc connector changelog ). karena itu pengaturan 2 parameter ini tidak berpengaruh karena diabaikan sepenuhnya (default baru adalah useLegacyDateTimeCode=false)
  • Dengan cara ini pengaturan serverTimezonemenjadi wajib jika salah satu zona waktu (server aplikasi / database) tidak dalam format 'UTC + xx' atau 'GMT + xx'
  • Tidak ada dampak pengaturan waktu server sebagai UTC (misalnya dengan jdbc:mysql://localhost:3306/myschema?serverTimezone=UTC, bahkan jika server aplikasi / basis data Anda tidak berada dalam zona waktu ini. Yang penting adalah agar string koneksi aplikasi + basis data disinkronkan dengan zona waktu yang sama. Dengan kata lain , cukup mengatur serverTimezone = UTC dengan zona waktu yang berbeda pada server database akan menggeser setiap tanggal yang diekstrak dari database
  • Zona waktu default MySQL dapat diatur ke UTC + 0 dengan file my.ini atau my.cnf (masing-masing windows / linux) dengan menambahkan baris default-time-zone='+00:00'(perincian dalam pos StackOverflow ini )
  • Database yang dikonfigurasikan pada AWS (layanan web amazon) secara otomatis ditetapkan UTC + 0 waktu default ( lihat halaman bantuan AWS di sini )
epol
sumber
1
Jawaban yang bagus, terima kasih. Berbagai peluru semuanya berguna. Saya pergi dengan saran untuk memasukkan file default-time-zone = '+00:00'homebrew /usr/local/etc/my.cnf. Tampaknya ruang di sekitar =itu penting sehingga Anda dapat mengedit peluru itu untuk memasukkannya.
Mark Edington
51

Jika Anda menggunakan Maven, Anda bisa mengatur versi konektor MySQL yang lain (saya mengalami kesalahan yang sama, jadi saya berubah dari 6.0.2 ke 5.1.39) di pom.xml:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.39</version>
</dependency>

Seperti yang dilaporkan dalam jawaban lain, masalah ini telah diperbaiki di versi 6.0.3 atau lebih tinggi, sehingga Anda dapat menggunakan versi yang diperbarui:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>6.0.3</version>
</dependency>

Maven akan secara otomatis membangun kembali proyek Anda setelah Anda menyimpan pom.xmlfile.

Gabriel Amazonas Mesquita
sumber
2
Bagi mereka yang mengunduh mysql-connector-java / 6 -> cukup unduh misal mysql-connector-java / 5.1.20 dan itu seharusnya berfungsi. Terima kasih!
Gabungkan
6
downgrade harus dihindari. juga, itu tidak diperbaiki dengan 6.0.6diam. lebih baik menggunakan solusi di atas
phil294
saya mendapatkan kesalahan yang sama bahkan dengan toples terbaru [mysql-connector-java-6.0.5.jar: 6.0.5]
user2478236
18
Saya memiliki ini bahkan di 8.0.12
Robert Niestroj
13
8.0.13 memberikan kesalahan yang sama. 5.1.47 bekerja untuk saya.
localhost
36

String koneksi harus diatur seperti ini:

jdbc:mysql://localhost/db?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC

Jika Anda mendefinisikan koneksi dalam xmlfile (seperti persistence.xml, standalone-full.xml, dll ..), bukan &Anda harus menggunakan &amp;atau menggunakan CDATAblok.

Alireza Alallah
sumber
1
Itu tidak benar. Titik useLegacyDatetimeCode = false tidak harus menentukan serverTimezone sehingga klien mengoreksi perbedaan zona waktu.
antgar9
Ini bekerja untuk saya terhubung ke MySQL 5.7 dengan phpStorm 2019.1.4.
moult86
29

Ini adalah bug di mysql-connector-java dari versi 5.1.33 ke 5.1.37. Saya sudah melaporkannya di sini: http://bugs.mysql.com/bug.php?id=79343

Diedit: Ini telah diperbaiki dari mysql-connector-java 5.1.39

Itu adalah kesalahan ketik di kelas TimeUtil dalam metode loadTimeZoneMappings yang meningkatkan lokasi NPE /com/mysql/jdbc/TimeZoneMapping.properties file. Jika Anda melihat kode, file tersebut harus berada di dalam loader kelas TimeUtil, bukan TimeZone:

TimeUtil.class.getResourceAsStream(TIME_ZONE_MAPPINGS_RESOURCE);

Parameter useLegacyDatetimeCode memungkinkan untuk memperbaiki perbedaan antara zona waktu klien dan server secara otomatis saat menggunakan tanggal. Jadi ada baiknya Anda tidak harus menentukan zona waktu di setiap bagian. Meskipun menggunakan parameter serverTimeZone adalah solusi, dan sementara itu tambalan dilepaskan, Anda dapat mencoba memperbaiki kode sendiri seperti yang saya lakukan.

  • Jika ini adalah aplikasi mandiri, Anda dapat mencoba hanya menambahkan kelas com / mysql / jdbc / TimeUtil yang diperbaiki ke kode Anda dan berhati-hati dengan urutan pemuatan jar. Ini dapat membantu: https://owenou.com/2010/07/20/patching-with-class-shadowing-and-maven.html

  • Jika ini adalah aplikasi web, solusi yang lebih mudah adalah membuat mysql-connector-java-5.1.37-patched.jar Anda sendiri, dengan mengganti .class langsung ke toples asli.

antgar9
sumber
Manis, terima kasih telah melaporkan ini. Senang seseorang telah berhasil menemukan bug. Apakah Anda tahu kapan perbaikan akan dirilis?
bluecollarcoder
Solusi yang Anda sarankan itu bagus, tapi saya pikir memodifikasi sumber driver dan mengelola ketergantungan Maven mungkin terlalu menjengkelkan bagi kebanyakan orang.
bluecollarcoder
4
@Gili Ini belum diperbaiki pada rilis 6.0.6
Imme22009
6
Bug ini masih ada di 8.0.11
John Little
3
@ JohnLittle Saya punya masalah ini juga di 8.0.15, tapi itu tidak disebabkan oleh bug lagi. Zona waktu dimuat dengan benar, tetapi CET dan CEST (zona waktu ini menyebabkan masalah bagi saya) tidak termasuk dalam TimeZone.getAvailableIDs()maupun dalam TimeZoneMapping.propertiessehingga solusi ini tidak akan membantu di sini. Solusinya mungkin akan diatur sepertiserverTimezone=Europe/Berlin
JPT
29

Saya memutuskan meletakkan string koneksi di bawah ini di URL

jdbc:mysql://localhost:3306/db?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
Rafael Costa Cavalcante
sumber
1
Itu tidak benar. Titik useLegacyDatetimeCode = false tidak harus menentukan serverTimezone sehingga klien mengoreksi perbedaan zona waktu.
antgar9
25

Ini bekerja untuk saya hanya dengan menambahkan serverTimeZone = UTC pada application.properties.
spring.datasource.url=jdbc:mysql://localhost/db?serverTimezone=UTC

Ahmed AMMOURI
sumber
22
  1. Saya menambahkan file konfigurasi mysql di bagian [mysqld]

    default_time_zone='+03:00'
  2. Dan restart server mysql:

    sudo service mysql restart

Di mana +03: 00 zona waktu UTC saya.

Path ke file config di os ubuntu 16.04 saya:

/etc/mysql/mysql.conf.d/mysqld.cnf

PERINGATAN: JIKA ZONA WAKTU ANDA MEMILIKI MUSIM PANAS DAN WAKTU MUSIM DINGIN. ANDA HARUS MENGUBAH UTC DALAM KONFIGASI JIKA MENGUBAH WAKTU. DUA KALI DALAM TAHUN (BIASANYA) ATAU SET CRONTAB DENGAN SUDO.

Koneksi jdbc url saya:

"jdbc:mysql://localhost/java"
Fortran
sumber
1
Harus me-restart Mysql pada dasarnya adalah nonstarter di hampir semua kasus penggunaan produksi. Ini menjadi lebih dari masalah ketika replikasi terlibat.
bluecollarcoder
@bluecollarcoder Membutuhkan tambahan hanya di bagian [mysqld]. Atau tambahkan bagian [mysqld] jika tidak ada bagian. Contoh config saya pastebin.com/j4F7t2KS
Fortran
1
Saya memperbarui server Linux saya / etc / localtime dari / usr / share / zoneinfo / US / Pacific ke / usr / share / zoneinfo / America / Los_Angeles kemudian memulai kembali layanan mysql dan ini memperbaiki masalah bagi saya.
vinnyjames
Dalam kasus saya untuk sintaks yang disediakan, ada kesalahan saat memulai ulang, dan sintaks yang benar adalah: default-time-zone='+03:00'sebagai gantinya, sesuai jawaban ini . Juga datang dari DBeaver.
wscourge
itu tidak tepat jika Anda harus memberitahu setiap pengembang di perusahaan Anda untuk mengubah konfigurasi MySQL mereka :)
pheromix
16

Saya memiliki masalah yang sama dan saya menyelesaikannya dengan menambahkan hanya "? ServerTimezone = UTC" ke koneksi string saya.

#

sinossi masalah saya:

java.sql.SQLException: Nilai zona waktu server 'CEST' tidak dikenal atau mewakili lebih dari satu zona waktu. Anda harus mengonfigurasi server atau driver JDBC (melalui properti konfigurasi serverTimezone) untuk menggunakan nilai zona waktu yang lebih spesifik jika Anda ingin menggunakan dukungan zona waktu.

my dbDriver = com.mysql.jdbc.Driver

my jar = mysql-connector-java-8.0.12.jar

my java = 1.8

my tomcat = Apache Tomcat Version 8.5.32

my MySql server = MySql ver.8.0.12 
felice de simone
sumber
14

Program di atas akan menghasilkan kesalahan zona waktu itu.

Setelah nama database Anda, Anda harus menambahkan ini: ?useTimezone=true&serverTimezone=UTC. Setelah selesai, kode Anda akan berfungsi dengan baik.

Semoga berhasil :)

Aathil Ahamed
sumber
14

Saya mengeksekusi berikut di sisi database saya.

mysql> SET @@global.time_zone = '+00:00';

mysql> SET @@session.time_zone = '+00:00';

mysql> SELECT @@global.time_zone, @@session.time_zone;

Saya menggunakan versi Server: 8.0.17 - MySQL Community Server - GPL

sumber: https://community.oracle.com/thread/4144569?start=0&tstart=0

Vishrant
sumber
Kamu menyelamatkan teman waktuku. terima kasih.
Kumar
13

Segala yang kami butuhkan untuk memperbaiki masalah dengan serverTimezone:

String url = "jdbc:mysql://localhost:3306/db?serverTimezone=" + TimeZone.getDefault().getID()
Ingvar
sumber
Itu terjadi pada saya juga dengan versi 5.4.15 terbaru. Tetapi tetap dengan ini: menambahkan "? ServerTimezone =" + TimeZone.getDefault (). GetID () "tepat di sebelah basis data Anda, menyelesaikan masalah.
Tes
10

Anda dapat menggunakan konektor MySQL di ketergantungan Maven,

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.14</version>
</dependency>

Maka Anda perlu mengatur parameter yang tepat dalam application.propertiesfile tersebut,

spring.datasource.url=jdbc:mysql://localhost:3306/UserReward?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
spring.datasource.username=testuser
spring.datasource.password=testpassword
# MySQL driver
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect
Chaklader Asfak Arefe
sumber
9

Saya menggunakan mysql-connector-java-8.0.13 dan memiliki masalah yang sama. Saya membuat basis data saya di konsol baris perintah dan memecahkan masalah ini dengan menggunakan solusi @Dimitry Rud di baris perintah:

SET GLOBAL time_zone = '-6:00';

Saya tidak perlu me-restart apa pun, mengatur waktu dan segera menjalankan kode saya di gerhana, itu terhubung tanpa masalah.

Bug seharusnya diperbaiki dalam versi yang lebih lama, tetapi saya rasa saya mendapatkan kesalahan ini karena setelah saya membuat database di konsol, saya tidak mengatur ini. Saya tidak menggunakan meja kerja atau aplikasi lain untuk mengelola ini daripada konsol.

Rrian
sumber
6

Dari mysql workbench, jalankan pernyataan sql berikut:

  1. SET @@ global.time_zone = '+00: 00';
  2. SET @@ session.time_zone = '+00: 00';

dengan pernyataan sql berikut periksa apakah nilainya ditetapkan:

SELECT @@ global.time_zone, @@ session.time_zone;

toof06
sumber
2
Ini berfungsi untuk saya ketika kesalahan yang dimaksud muncul saat mencoba membuat koneksi dari IntelliJ IDEA.
Faheem Hassan Zunjani
6

Ini berhasil untuk saya.

pada DBeaver 6.0: Buka Pengaturan Koneksi> Properti Driver> Zona Waktu Server> Atur UTC.

Juga, dalam konfigurasi booting pegas, harus mengatur properti di bawah ini.

jdbc: mysql: // localhost: /? serverTimezone = UTC

Anil Gowda
sumber
5

Rupanya, untuk mendapatkan driver MySQL JDBC versi 5.1.33 agar berfungsi dengan zona waktu UTC, kita harus menentukan serverTimezone secara eksplisit dalam string koneksi.

spring.datasource.url = jdbc:mysql://localhost:3306/quartz_demo?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
harun ugur
sumber
3

Saya juga mengalami masalah yang sama persis di LibreOffice Base. Jadi saya hanya menentukan zona waktu 'daylight saving time' di string koneksi.
** masukkan deskripsi gambar di sini **

Saya mencoba tanpa "& serverTimezone = MST" tetapi gagal juga.

Saya juga mencoba "& serverTimezone = MDT" dan gagal, jadi untuk beberapa alasan, tidak suka waktu musim panas!

GordR
sumber
3

Saya memiliki masalah yang sama ketika saya mencoba untuk bekerja dengan proyek spring boot di windows.

Url data sumber harus:

spring.datasource.url=jdbc:mysql://localhost/database?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC

Berkay Ernalbant
sumber
3

Jalankan query di bawah ini ke mysql DB untuk menyelesaikan kesalahan

MariaDB [xxx> SET @@global.time_zone = '+00:00';
Query OK, 0 rows affected (0.062 sec)

MariaDB [xxx]> SET @@session.time_zone = '+00:00';
Query OK, 0 rows affected (0.000 sec)

MariaDB [xxx]> SELECT @@global.time_zone, @@session.time_zone;
saurabh asthana
sumber
3

i Got error mirip dengan Anda tetapi nilai zona waktu server saya adalah 'Afr. centrale Ouest 'jadi saya melakukan langkah-langkah ini:

MyError (pada IntelliJ IDEA Community Edition):

    InvalidConnectionAttributeException: The server time zone value 'Afr. centrale Ouest' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the 'serverTimezone' configuration property) to use a more specifc time zone value if you want to u....

Saya menghadapi masalah ini ketika saya memutakhirkan server mysql saya ke SQL Server 8.0 (MYSQL80).

Solusi paling sederhana untuk masalah ini adalah cukup tulis perintah di bawah ini di MYSQL Workbench Anda -

  SET GLOBAL time_zone = '+1:00'

Nilai setelah zona waktu akan sama dengan GMT +/- Perbedaan di zona waktu Anda. Contoh di atas adalah untuk Afrika Utara (GMT + 1: 00) / atau untuk India (GMT + 5: 30). Ini akan menyelesaikan masalah.

Masukkan kode berikut di Mysql Workbench Anda dan jalankan quesry

[tautan sumber untuk pertanyaan / masalah]

[tautan sumber untuk jawaban]

[Solution ScreenShot]

iifast
sumber
2
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/resultout? useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC","root",""))

Ini sebenarnya solusi untuk masalah ini, tetapi jangan hanya menyalin dan menempelnya di program Anda. Jika Anda baru saja membaca baris Anda akan menemukan 'resultout', itulah nama database saya, dan Anda harus menulis milik Anda.

Ada tiga komponen string, yang pertama adalah url, yang kedua adalah nama pengguna, dan yang ketiga adalah kata sandi. Pada paragraf di atas kami membersihkan, url. Komponen String kedua dan ketiga seperti kata nama pengguna dan kata sandi Anda, Anda harus mengubah sesuai.

Terima kasih

Pratham Sarankar
sumber
1

Saya memecahkan masalah ini tanpa perubahan kode tunggal. hanya pengaturan waktu sistem goto dan mengatur zona waktu. Dalam kasus saya, zona waktu default adalah UTC yang saya ubah menjadi zona waktu lokal saya. Setelah saya me-restart semua layanan, semuanya bekerja untuk saya.

Nikunj Shroff
sumber
1

Saya terlambat, Tapi Jika Anda berjuang melalui kesalahan berikut dan menggunakan sumber data (javax.sql.DataSource):

The server time zone value 'CEST' is unrecognized or represents more than one time zone.

Tetapkan baris berikut untuk menghilangkan kesalahan:

MysqlDataSource dataSource = new MysqlDataSource();
dataSource.setServerTimezone("UTC");
Rituraj Singh Rathore
sumber
1

Dalam kasus saya, itu adalah lingkungan pengujian dan saya harus membuat aplikasi yang sudah ada untuk bekerja tanpa perubahan konfigurasi, dan jika mungkin tanpa perubahan konfigurasi MySQL. Saya dapat memperbaiki masalah ini dengan mengikuti saran @vinnyjames dan mengubah zona waktu server ke UTC :

ln -sf /usr/share/zoneinfo/UTC /etc/localtime
service mysqld restart

Melakukan itu sudah cukup bagi saya untuk menyelesaikan masalah.

Dmitriusan
sumber
1

Saya telah menambahkan baris berikut ke /etc/mysql/my.cnffile saya :

default_time_zone='+00:00'

Mulai ulang server MySQL:

systemctl restart mysql

Dan itu berfungsi seperti pesona.

Tadej
sumber
1

Tidak ada dampak pengaturan waktu server sebagai UTC (misalnya dengan jdbc:mysql://localhost:3306/myschema?serverTimezone=UTC , bahkan jika server aplikasi / basis data Anda tidak berada dalam zona waktu ini. Yang penting adalah agar string koneksi aplikasi + basis data disinkronkan dengan zona waktu yang sama.

Dengan kata lain, hanya pengaturan serverTimezone=UTCdengan zona waktu yang berbeda pada server database akan menggeser setiap tanggal yang diekstrak dari database

Hermann N'ZI
sumber
0

Setuju dengan jawaban @bluecollarcoder, tetapi lebih baik digunakan TimeZone.getDefault().getID();di akhir string koneksi:

"jdbc:mysql://localhost/db?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=" + TimeZone.getDefault().getID();  

Dalam hal ini Timezoneparameter diperbarui secara otomatis tergantung pada zona waktu mesin lokal.

Yerbol
sumber
Itu tidak benar. Titik useLegacyDatetimeCode = false tidak harus menentukan serverTimezone sehingga klien mengoreksi perbedaan zona waktu.
antgar9
0

Cukup modifikasi string koneksi dengan kode berikut di file application.properties.


spring.datasource.url=jdbc:mysql://localhost:3301/Db?
   useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=
   false&serverTimezone=UTC
Mittal
sumber