Saya perlu memaksakan operasi terkait waktu apa pun ke GMT / UTC, terlepas dari zona waktu yang disetel pada mesin. Adakah cara mudah untuk melakukannya dalam kode?
Untuk memperjelas, saya menggunakan waktu server DB untuk semua operasi, tetapi hasilnya diformat sesuai dengan zona waktu lokal.
Terima kasih!
Jawaban:
OP menjawab pertanyaan ini untuk mengubah zona waktu default untuk satu instance JVM yang sedang berjalan, setel
user.timezone
properti sistem:Jika Anda perlu menyetel zona waktu tertentu saat mengambil objek Tanggal / Waktu / Timestamp dari database
ResultSet
, gunakan bentuk kedua darigetXXX
metode yang mengambilCalendar
objek:Atau, mengatur tanggal di PreparedStatement:
Ini akan memastikan bahwa nilai yang disimpan dalam database konsisten ketika kolom database tidak menyimpan informasi zona waktu.
The
java.util.Date
danjava.sql.Date
kelas menyimpan waktu yang sebenarnya (milidetik) di UTC. Untuk memformatnya pada keluaran ke zona waktu lain, gunakanSimpleDateFormat
. Anda juga dapat mengaitkan zona waktu dengan nilai menggunakan objek Kalender:Referensi Berguna
https://docs.oracle.com/javase/9/troubleshoot/time-zone-settings-jre.htm#JSTGD377
https://confluence.atlassian.com/kb/setting-the-timezone-for-the-java-environment-841187402.html
sumber
Juga jika Anda dapat mengatur zona waktu JVM dengan cara ini
atau
-Duser.timezone=GMT
di args JVM.sumber
System.setProperty("user.timezone" ...)
tidak bekerja.Saya harus menyetel zona waktu JVM untuk Windows 2003 Server karena selalu mengembalikan GMT untuk Tanggal baru ();
-Duser.timezone=America/Los_Angeles
Atau zona waktu Anda yang sesuai. Menemukan daftar zona waktu ternyata sedikit menantang juga ...
Berikut adalah dua daftar;
http://wrapper.tanukisoftware.com/doc/english/prop-timezone.html
http://publib.boulder.ibm.com/infocenter/iseries/v5r3/index.jsp?topic=%2Frzatz%2F51%2Fadmin%2Freftz.htm
sumber
Anda dapat mengubah zona waktu menggunakan TimeZone.setDefault () :
sumber
bagi saya, SimpleDateFormat cepat,
lalu format tanggal dengan zona waktu yang berbeda.
sumber
Saya akan mengambil waktu dari DB dalam bentuk mentah (stempel waktu lama atau Tanggal java), dan kemudian menggunakan SimpleDateFormat untuk memformatnya, atau Kalender untuk memanipulasinya. Dalam kedua kasus, Anda harus menyetel zona waktu objek sebelum menggunakannya.
Lihat
SimpleDateFormat.setTimeZone(..)
danCalendar.setTimeZone(..)
untuk detailnyasumber
tl; dr
Hindari bergantung pada OS host atau JVM untuk zona waktu default
Saya sarankan Anda menulis semua kode Anda untuk secara eksplisit menyatakan zona waktu yang diinginkan / diharapkan. Anda tidak perlu bergantung pada zona waktu default JVM saat ini. Dan ketahuilah bahwa zona waktu default JVM saat ini dapat berubah kapan saja selama waktu proses , dengan kode apa pun di utas apa pun dari panggilan aplikasi apa pun
TimeZone.setDefault
. Panggilan semacam itu segera memengaruhi semua aplikasi dalam JVM tersebut.java.time
Beberapa Jawaban lain benar, tetapi sekarang sudah ketinggalan zaman. Kelas tanggal-waktu yang mengerikan yang digabungkan dengan versi Java yang paling awal memiliki cacat, ditulis oleh orang-orang yang tidak memahami kerumitan dan seluk-beluk penanganan waktu-tanggal.
Kelas tanggal-waktu warisan telah digantikan oleh kelas java.time yang ditentukan di JSR 310.
Untuk mewakili zona waktu, gunakan
ZoneId
. Untuk merepresentasikan offset-from-UTC, gunakanZoneOffset
. Offset hanyalah beberapa jam-menit-detik di depan atau di belakang meridian utama. Zona waktu lebih dari itu. Zona waktu adalah sejarah perubahan masa lalu, sekarang, dan masa depan untuk offset yang digunakan oleh orang-orang di wilayah tertentu.Untuk offset nol jam-menit-detik, gunakan konstanta
ZoneOffset.UTC
.Instant
Untuk menangkap momen saat ini di UTC, gunakan
Instant
. Kelas ini mewakili momen dalam UTC, selalu dalam UTC menurut definisi.ZonedDateTime
Untuk melihat momen yang sama melalui jam dinding yang digunakan oleh orang-orang di wilayah tertentu, sesuaikan dengan zona waktu. Momen yang sama, titik yang sama di garis waktu, waktu jam dinding yang berbeda.
Database
Anda menyebutkan database.
Untuk mengambil momen dari database, kolom Anda harus dari tipe data yang mirip dengan standar SQL
TIMESTAMP WITH TIME ZONE
. Mengambil objek, bukan string. Di JDBC 4.2 dan yang lebih baru, kita dapat bertukar objek java.time dengan database. TheOffsetDateTime
diperlukan oleh JDBC, sementaraInstant
&ZonedDateTime
adalah opsional.Di sebagian besar database dan driver, saya rasa Anda akan mendapatkan momen seperti yang terlihat di UTC. Namun jika tidak, Anda dapat menyesuaikan dengan salah satu dari dua cara berikut:
Instant
:odt.toInstant()
Tentang java.time
The java.time kerangka dibangun ke Jawa 8 dan kemudian. Kelas-kelas ini menggantikan tua merepotkan warisan kelas tanggal-waktu seperti
java.util.Date
,Calendar
, &SimpleDateFormat
.Untuk mempelajari lebih lanjut, lihat Tutorial Oracle . Dan cari Stack Overflow untuk banyak contoh dan penjelasan. Spesifikasinya adalah JSR 310 .
Proyek Joda-Time , sekarang dalam mode pemeliharaan , menyarankan migrasi ke kelas java.time .
Anda dapat bertukar objek java.time langsung dengan database Anda. Gunakan driver JDBC yang sesuai dengan JDBC 4.2 atau yang lebih baru. Tidak perlu string, tidak perlu
java.sql.*
kelas.Dimana mendapatkan kelas java.time?
sumber
buat sepasang klien / server, sehingga setelah eksekusi, server klien mengirimkan waktu dan tanggal yang benar. Kemudian, klien meminta server pm GMT dan server mengirimkan kembali jawabannya dengan benar.
sumber
Gunakan properti sistem:
sumber
Jalankan baris ini di MySQL untuk mengatur ulang zona waktu Anda:
sumber
Wow. Saya tahu ini adalah utas kuno tetapi yang bisa saya katakan hanyalah jangan memanggil TimeZone.setDefault () dalam kode tingkat pengguna mana pun. Ini selalu menetapkan Zona Waktu untuk seluruh JVM dan hampir selalu merupakan ide yang sangat buruk. Pelajari cara menggunakan perpustakaan joda.time atau kelas DateTime baru di Java 8 yang sangat mirip dengan perpustakaan joda.time.
sumber
Jika Anda ingin mendapatkan waktu GMT hanya dengan intiger: var currentTime = new Date (); var currentYear = '2010' var currentMonth = 10; var currentDay = '30 'var currentHours = '20' var currentMinutes = '20 'var currentSeconds = '00' var currentMilliseconds = '00 '
sumber