Saya telah mem-parsing java.util.Date
dari String
tetapi pengaturan zona waktu lokal sebagai zona waktu date
objek.
Zona waktu tidak ditentukan dalam String
dari yang Date
diuraikan. Saya ingin mengatur zona waktu tertentu dari date
objek.
Bagaimana saya bisa melakukan itu?
java
date
timezone
java.util.date
Yatendra Goel
sumber
sumber
Jawaban:
Gunakan DateFormat. Sebagai contoh,
sumber
TimeZone.setDefault()
memanggil sebelumgetTime()
agar objek tanggal baru berada di zona waktu yang Anda inginkan. Di JDK 1.8,Calendar.getTime()
panggilanreturn new Date(getTimeInMillis());
.Ketahuilah bahwa
java.util.Date
objek tidak mengandung informasi zona waktu sendiri - Anda tidak dapat mengatur zona waktu padaDate
objek. Satu-satunya benda yangDate
berisi objek adalah sejumlah milidetik sejak "zaman" - 1 Januari 1970, 00:00:00 UTC.Seperti yang ditunjukkan ZZ Coder, Anda mengatur zona waktu pada
DateFormat
objek, untuk memberitahukannya di zona waktu mana Anda ingin menampilkan tanggal dan waktu.sumber
long
bidang yang disebutfastTime
.Date.toString()
sebenarnya menggunakanCalendar
untuk menafsirkan waktu milidetik ini. Jadi, mencetak aDate
membuatnya tampak memiliki zona waktu (default), yang mengarah ke pertanyaan yang dapat dimengerti tentang cara mengatur zona waktu itu.tl; dr
Tidak Ada Zona Waktu di juDate
Seperti yang dinyatakan dengan jawaban benar lainnya, java.util.Date tidak memiliki zona waktu † . Ini mewakili UTC / GMT (tidak ada offset zona waktu). Sangat membingungkan karena
toString
metodenya menerapkan zona waktu default JVM saat membuat representasi String.Hindari menjodohkan
Untuk alasan ini dan banyak lainnya, Anda harus menghindari menggunakan java.util.Date & .Calendar & java.text.SimpleDateFormat bawaan. Mereka terkenal merepotkan.
Sebagai gantinya gunakan paket java.time yang dibundel dengan Java 8 .
waktu java
Kelas java.time dapat mewakili momen di timeline dalam tiga cara:
Instant
)OffsetDateTime
denganZoneOffset
)ZonedDateTime
denganZoneId
)Instant
Di java.time , blok pembangun dasar adalah
Instant
, sesaat di garis waktu di UTC. GunakanInstant
objek untuk banyak logika bisnis Anda.OffsetDateTime
Terapkan offset-dari-UTC untuk menyesuaikan waktu tempuh jam tertentu dengan suatu daerah .
Terapkan
ZoneOffset
untuk mendapatkanOffsetDateTime
.ZonedDateTime
Lebih baik menerapkan zona waktu , offset, dan aturan untuk menangani anomali seperti Daylight Saving Time (DST) .
Oleskan
ZoneId
keInstant
untuk mendapatkanZonedDateTime
. Selalu tentukan nama zona waktu yang tepat . Jangan pernah menggunakan 3-4 singkatan sepertiEST
atauIST
yang tidak unik atau standar.LocalDateTime
Jika string input tidak memiliki indikator offset atau zona, parsing sebagai a
LocalDateTime
.Jika Anda yakin dengan zona waktu yang dimaksud, tetapkan a
ZoneId
untuk menghasilkan aZonedDateTime
. Lihat contoh kode di atas di bagian dr di atas.String Terformat
Panggil
toString
metode pada salah satu dari tiga kelas ini untuk menghasilkan String yang mewakili nilai tanggal-waktu dalam format standar ISO 8601 . TheZonedDateTime
kelas meluas format standar dengan menambahkan nama zona waktu dalam tanda kurung.Untuk format lain gunakan
DateTimeFormatter
kelas. Umumnya terbaik untuk membiarkan kelas itu menghasilkan format lokal menggunakan bahasa manusia yang diharapkan dan norma-norma budaya. Atau Anda dapat menentukan format tertentu.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
.Proyek Joda-Time , sekarang dalam mode pemeliharaan , menyarankan migrasi ke kelas java.time .
Untuk mempelajari lebih lanjut, lihat Tutorial Oracle . Dan cari Stack Overflow untuk banyak contoh dan penjelasan. Spesifikasi adalah JSR 310 .
Anda dapat bertukar objek java.time secara langsung dengan database Anda. Gunakan driver JDBC yang sesuai dengan JDBC 4.2 atau yang lebih baru. Tidak perlu untuk string, tidak perlu untuk
java.sql.*
kelas.Di mana mendapatkan kelas java.time?
Proyek ThreeTen-Extra memperpanjang java.time dengan kelas tambahan. Proyek ini adalah ajang pembuktian untuk kemungkinan penambahan masa depan ke java.time. Anda mungkin menemukan beberapa kelas berguna di sini seperti
Interval
,YearWeek
,YearQuarter
, dan lebih .Joda-Time
Sementara Joda-Time masih dipelihara secara aktif, pembuatnya telah memberitahu kami untuk bermigrasi ke java.time sesegera mungkin. Saya membiarkan bagian ini tetap utuh sebagai referensi, tetapi saya sarankan menggunakan
java.time
bagian di atas sebagai gantinya.Dalam Joda-Time , objek tanggal-waktu (
DateTime
) benar-benar mengetahui zona waktu yang ditentukan. Itu berarti offset dari UTC dan aturan serta riwayat Daylight Saving Time (DST) zona waktu itu dan anomali lainnya.Panggil
toString
metode untuk menghasilkan String dalam format ISO 8601 .Joda-Time juga menawarkan kemampuan yang kaya untuk menghasilkan semua jenis format String lainnya.
Jika diperlukan, Anda dapat mengonversi dari Joda-Time DateTime ke java.util.Date.
Cari StackOverflow untuk "joda date" untuk menemukan lebih banyak contoh, beberapa cukup detail.
† Sebenarnya ada adalah zona waktu tertanam dalam java.util.Date, digunakan untuk beberapa fungsi internal (lihat komentar pada Jawaban ini). Tetapi zona waktu internal ini tidak terekspos sebagai properti, dan tidak dapat ditetapkan. Zona waktu internal ini bukan yang digunakan oleh
toString
metode dalam menghasilkan representasi string dari nilai tanggal-waktu; alih-alih zona waktu default JVM saat ini diterapkan saat itu juga. Jadi, sebagai steno, kita sering mengatakan "juDate tidak memiliki zona waktu". Membingungkan? Iya. Namun alasan lain untuk menghindari kelas lama yang lelah ini.sumber
BaseCalendar.Date cdate
propertinya jika disetel. Lihatlah kode sumber di sini . Anda tidak dapat mengatur zona waktu objek juDate kecuali dengan mengubah zona waktu default JVM dengan memanggilTimeZone.setDefault(TimeZone.getTimeZone("NEW_TIME_ZONE"));
. Dengan demikian, ada offset zona waktu dan Anda bisa mendapatkan offset itu dengan memanggil metode yang sudah usang, juDate.getTimezoneOffset ()toString
metode yang menerapkan zona waktu default JVM saat ini; lagi-lagi mengabaikan zona waktu yang terkubur. Jadi untuk singkatnya, kita katakan java.util.Date tidak memiliki zona waktu. Seperti Seni , itu adalah kebohongan yang mengatakan yang sebenarnya.TimeZone.setDefault
, Anda tidak mengatur zona waktu objek java.util.Date - objek Date masih mengabaikan zona waktu yang dimakamkan, bertindak efektif dalam UTC. Anda akan memengaruhitoString
metode Date . Pengaturan default mengubah zona waktu standar JVM yang biasanya diatur ke zona waktu sistem operasi host. Panggilan itu tidak disarankan karena memengaruhi semua kode di semua utas dari semua aplikasi yang berjalan di JVM itu, dan melakukannya sambil jalan saat mereka mengeksekusi. Menjadi kasar dan berbahaya, panggilan itu hanya dianggap sebagai upaya terakhir.equals
,hashcode
,getTime
..) Jika anda melihat padaequals
metode, itu panggilangetTime()
yang panggilangetTimeImpl()
, yang panggilannormalize()
jikacdate
properti tidak dinormalisasi. Dalamnormalize()
metode, kondisi terakhir jika menghitung ulang milidetik sejak 1/1/70 berdasarkan informasi zona waktu yang disimpannya jika zona waktucdate
berbeda dari zona waktu lingkungan JVM saat ini. (Lihatlahsun.util.calendar.AbstractCalendar getCalendarDate(long millis, CalendarDate date)
)Anda juga bisa mengatur zona waktu di level JVM
keluaran:
sumber
TimeZone.setDefault
agak drastis, karena memengaruhi seluruh JVM, memengaruhi semua objek dan utas lainnya. Lihat jawaban ini untuk perincian termasuk bahkan lebih banyak komplikasi jika Anda menjalankan dengan SecurityManager. Menambahkan lebih banyak komplikasi: Perilaku ini telah berubah di berbagai versi Java, seperti yang dibahas dalam Pertanyaan ini .Jika Anda harus bekerja dengan hanya kelas JDK standar, Anda dapat menggunakan ini:
Kredit masuk ke pos ini .
sumber
java.util.Calendar
adalah cara biasa untuk menangani zona waktu hanya menggunakan kelas JDK. Apache Commons memiliki beberapa alternatif / utilitas lebih lanjut yang mungkin bermanfaat. Sunting Catatan Spong mengingatkan saya bahwa saya telah mendengar hal-hal yang sangat baik tentang Joda-Time (meskipun saya belum menggunakannya sendiri).sumber
Period
,Duration
danInterval
. Mereka bentang termasuk metode perbandingan seperticontains
,abuts
,overlap
, dangap
. DanPeriodFormatterBuilder
dapat membangun frase deskriptif seperti "15 tahun dan 8 bulan".Konversikan Date to String dan lakukan dengan SimpleDateFormat.
sumber
Jika ada yang membutuhkan ini, jika Anda perlu mengubah
XMLGregorianCalendar
zona waktu ke zona waktu Anda saat ini dari UTC, maka yang perlu Anda lakukan adalah mengatur zona waktu0
, lalu menelepontoGregorianCalendar()
- ia akan tetap berada di zona waktu yang sama, tetapi yangDate
tahu bagaimana mengubahnya menjadi milik Anda, sehingga Anda bisa mendapatkan data dari sana.Hasil:
sumber
Kode ini bermanfaat dalam aplikasi yang sedang saya kerjakan:
sumber