tl; dr
menyarankan "praktik terbaik" saat ini di sekitar Date
danCalendar
apakah yang terbaik adalah selalu Calendar
lebih menyukaiDate
Hindari kelas-kelas warisan ini sepenuhnya. Gunakan kelas java.time sebagai gantinya.
- Untuk sejenak di UTC , gunakan (setara dengan modern )
Instant
Date
- Untuk sesaat di zona waktu tertentu , gunakan (setara dengan modern )
ZonedDateTime
GregorianCalendar
- Untuk sesaat dalam offset-dari-UTC tertentu , gunakan (tidak ada yang setara di kelas legacy)
OffsetDateTime
- Untuk tanggal-waktu (bukan momen) dengan zona waktu atau offset yang tidak diketahui, gunakan (tidak ada yang setara di kelas legacy)
LocalDateTime
Detail
The Answer Ortomala Lokni yang tepat untuk menyarankan menggunakan modern java.time kelas daripada kelas warisan tanggal-waktu lama merepotkan ( Date
, Calendar
, dll). Tetapi Jawaban itu menyarankan kelas yang salah sebagai setara (lihat komentar saya pada Jawaban itu).
Menggunakan java.time
Kelas java.time adalah peningkatan besar atas kelas tanggal-waktu lama, perbedaan malam-dan-hari. Kelas-kelas lama dirancang dengan buruk, membingungkan, dan merepotkan. Anda harus menghindari kelas lama jika memungkinkan. Tetapi ketika Anda perlu mengkonversi ke / dari yang lama / baru, Anda dapat melakukannya dengan memanggil metode baru, tambahkan ke kelas lama .
Untuk informasi lebih lanjut tentang konversi, lihat Jawab saya dan diagram bagus untuk Pertanyaan lain, Konversi java.util. Tanggal ke tipe "java.time" apa? .
Pencarian Stack Overflow memberikan ratusan contoh Pertanyaan dan Jawaban tentang penggunaan java.time. Tapi ini sinopsis singkatnya.
Instant
Dapatkan momen saat ini dengan Instant
. The Instant
kelas merupakan saat di timeline di UTC dengan resolusi nanodetik (hingga sembilan (9) angka dari pecahan desimal).
Instant instant = Instant.now();
ZonedDateTime
Untuk melihat momen simultan yang sama melalui lensa waktu jam dinding wilayah tertentu , terapkan zona waktu ( ZoneId
) untuk mendapatkan a ZonedDateTime
.
Zona waktu
Tentukan nama zona waktu yang tepat dalam format continent/region
, seperti America/Montreal
, Africa/Casablanca
, atau Pacific/Auckland
. Jangan pernah menggunakan singkatan 3-4 huruf seperti EST
atau IST
karena mereka bukan zona waktu yang sebenarnya, tidak terstandarisasi, dan bahkan tidak unik (!).
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone();
Mengimbangi
Zona waktu adalah sejarah perubahan suatu kawasan dalam offset-dari-UTC . Namun terkadang Anda hanya diberikan offset tanpa zona penuh. Dalam hal itu, gunakan OffsetDateTime
kelas.
ZoneOffset offset = ZoneOffset.parse( "+05:30" );
OffsetDateTime odt = instant.atOffset( offset );
Penggunaan zona waktu lebih disukai daripada penggunaan offset semata.
LocalDateTime
"Lokal" dalam Local…
kelas berarti lokalitas apa saja , bukan lokalitas tertentu. Jadi namanya bisa kontra-intuitif.
LocalDateTime
,, LocalDate
dan LocalTime
sengaja tidak memiliki informasi tentang offset atau zona waktu. Jadi mereka tidak mewakili momen aktual, mereka bukan poin di timeline. Saat ragu atau bingung, gunakan ZonedDateTime
bukan LocalDateTime
. Cari Stack Overflow untuk diskusi lebih lanjut.
String
Jangan mengacaukan objek waktu-waktu dengan string yang mewakili nilainya. Anda bisa menguraikan string untuk mendapatkan objek waktu-tanggal, dan Anda bisa menghasilkan string dari objek tanggal-waktu. Tetapi string tidak pernah tanggal-waktu itu sendiri.
Pelajari tentang format standar ISO 8601 , yang digunakan secara default di kelas java.time.
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 .
Menggunakan driver JDBC yang sesuai dengan JDBC 4.2 atau yang lebih baru, Anda dapat bertukar objek java.time secara langsung dengan database Anda. Tidak perlu untuk string atau kelas java.sql. *.
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 .