Saya punya masalah dengan kelas Tanggal di Jawa. Kelas tanggal mengembalikan tanggal mesin lokal tetapi saya membutuhkan UTC-0.
Saya telah mencari di Google dan menemukan solusi hebat untuk JavaScript tetapi untuk Java tidak ada yang berguna.
Bagaimana cara mendapatkan tanggal UTC + 0 di Java 8?
java.util.Date
tidak pernah merupakan tanggal mesin lokal. Itu selalu didefinisikan sebagai milidetik berlalu sejak 1970-01-01 relatif terhadap UTC + 00: 00. Mungkin perilaku metodenyatoString()
membingungkan Anda yang memang menggunakan representasi di zona waktu lokal.Jawaban:
Dengan Java 8 Anda dapat menulis:
Untuk menjawab komentar Anda, Anda kemudian dapat mengubahnya menjadi Tanggal (kecuali jika Anda bergantung pada kode lama, saya tidak melihat alasannya) atau menjadi milidetik sejak zaman:
sumber
OffsetDateTime
daripadaZonedDateTime
mengingat bahwa kami bekerja hanya dengan offset-from-UTC daripada zona waktu penuh?tl; dr
java.time
Kelas tanggal-waktu lama yang merepotkan yang digabungkan dengan versi Java paling awal telah digantikan oleh kelas java.time yang dibangun ke dalam Java 8 dan yang lebih baru. Lihat Tutorial Oracle . Sebagian besar fungsionalitas telah di-back-port ke Java 6 & 7 di ThreeTen-Backport dan selanjutnya diadaptasi ke Android di ThreeTenABP .
Instant
Sebuah
Instant
mewakili momen di garis waktu dalam UTC dengan resolusi hingga nanodetik .The
toString
Metode menghasilkan objek String dengan teks yang mewakili nilai tanggal-waktu menggunakan salah satu standar ISO 8601 format.The
Instant
kelas kelas bangunan-blok dasar di java.time. Ini harus menjadi kelas andalan Anda saat menangani tanggal-waktu karena umumnya praktik terbaik adalah melacak, menyimpan, dan bertukar nilai waktu-tanggal dalam UTC.OffsetDateTime
Tetapi
Instant
memiliki keterbatasan seperti tidak ada opsi pemformatan untuk menghasilkan string dalam format alternatif. Untuk fleksibilitas lebih, ubah dariInstant
menjadiOffsetDateTime
. Tentukan offset-dari-UTC . Dalam java.time itu berarti sebuahZoneOffset
objek. Di sini kami ingin tetap menggunakan UTC (+00) sehingga kami dapat menggunakan konstanta yang sesuaiZoneOffset.UTC
.Atau lewati
Instant
kelas.Sekarang dengan sebuah
OffsetDateTime
objek di tangan, Anda dapat menggunakanDateTimeFormatter
untuk membuat objek String dengan teks dalam format alternatif. Cari Stack Overflow untuk banyak contoh penggunaanDateTimeFormatter
.ZonedDateTime
Jika Anda ingin menampilkan waktu jam dinding untuk beberapa zona waktu tertentu, terapkan a
ZoneId
untuk mendapatkan aZonedDateTime
.Dalam contoh ini kami menerapkan zona waktu Montréal. Di musim panas, di bawah omong kosong Daylight Saving Time (DST) , zona memiliki offset
-04:00
. Jadi perhatikan bagaimana waktu hari adalah empat jam lebih awal dalam output,15
bukan19
jam.Instant
danZonedDateTime
keduanya mewakili momen serentak yang sama, hanya dilihat melalui dua lensa berbeda.Mengonversi
Meskipun Anda harus menghindari kelas tanggal-waktu lama, jika harus, Anda dapat mengonversi menggunakan metode baru yang ditambahkan ke kelas lama. Di sini kami menggunakan
java.util.Date.from( Instant )
danjava.util.Date::toInstant
.Dan pergi ke arah lain.
Demikian pula, cari metode baru yang ditambahkan ke
GregorianCalendar
(subclass dariCalendar
) untuk dikonversi ke dan darijava.time.ZonedDateTime
.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. Hibernate 5 & JPA 2.2 mendukung java.time .Dimana mendapatkan kelas java.time?
sumber
ZonedDateTime
tidak akan diperlukan karena semuaZoneId
akan memetakan ke satu yangZoneOffset
bisa kita gunakanOffsetDateTime
?Di java8, saya akan menggunakan
Instant
kelas yang sudah ada di UTC dan nyaman untuk digunakan.Atau, Anda dapat menggunakan yang berikut ini:
Kembali ke
Instant
sumber
Instant
yang tidak pada waktu setempat. SebuahInstant
definisi oleh dalam UTC. Jadi tidak perlu intrik yang terlihat dalam Answer ini mencoba masuk ke UTC; yangInstant
sudah adalah di UTC. Lihat Jawaban saya untuk info lebih lanjut dan kode yang lebih sederhana.Di Java8 Anda menggunakan API Waktu baru, dan mengonversi Sekejap menjadi ZonedDateTime Menggunakan UTC TimeZone
sumber
Solusi 1 baris di Java 8:
sumber