Java 8 memiliki pustaka yang sama sekali baru untuk tanggal dan waktu dalam paket java.time yang merupakan hal yang sangat disambut baik bagi siapa saja yang harus menggunakan JodaTime sebelum atau repot dengan membuat sendiri metode pemrosesan pembantu tanggal. Banyak kelas dalam paket ini mewakili stempel waktu dan memiliki metode pembantu seperti getHour()
mendapatkan jam dari stempel waktu, getMinute()
untuk mendapatkan beberapa menit dari stempel waktu, getNano()
untuk mendapatkan nanos dari stempel waktu dll ...
Saya perhatikan bahwa mereka tidak memiliki metode yang dipanggil getMillis()
untuk mendapatkan miliaran cap waktu. Sebaliknya seseorang harus memanggil metode get(ChronoField.MILLI_OF_SECOND)
. Bagi saya, itu tampak seperti ketidakkonsistenan di perpustakaan. Adakah yang tahu mengapa metode seperti itu hilang, atau karena Java 8 masih dalam pengembangan, apakah ada kemungkinan akan ditambahkan nanti?
https://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html
Kelas-kelas yang didefinisikan di sini mewakili konsep tanggal-waktu utama, termasuk instance, durasi, tanggal, waktu, zona waktu dan periode. Mereka didasarkan pada sistem kalender ISO, yang merupakan kalender dunia de facto mengikuti aturan Gregorian yang subur. Semua kelas tidak dapat diubah dan aman untuk digunakan.
Setiap instance waktu tanggal terdiri dari bidang yang mudah disediakan oleh API. Untuk akses tingkat rendah ke bidang merujuk ke
java.time.temporal
paket. Setiap kelas menyertakan dukungan untuk mencetak dan menguraikan segala macam tanggal dan waktu. Lihatjava.time.format
paket untuk opsi penyesuaian ...
Contoh kelas semacam ini:
https://docs.oracle.com/javase/8/docs/api/java/time/LocalDateTime.html
Tanggal-waktu tanpa zona waktu dalam sistem kalender ISO-8601, seperti 2007-12-03T10: 15: 30.
LocalDateTime
adalah objek tanggal-waktu yang tidak dapat berubah yang mewakili waktu-tanggal, sering dipandang sebagai tahun-bulan-hari-jam-menit-detik. Bidang tanggal dan waktu lainnya, seperti hari-tahun, hari-minggu dan minggu-tahun, juga dapat diakses. Waktu direpresentasikan ke presisi nanodetik. Misalnya, nilai "2 Oktober 2007 pada 13: 45.30.123456789" dapat disimpan dalamLocalDateTime
...
get()
, alih-alih memberi mereka nama-nama unik dan individual. Jika itu mengganggu Anda, tulislah sebuah kelas yang mewarisi kelas asli, dan letakkangetMillis()
metode Anda sendiri di kelas yang baru.Instant
kelasJawaban:
JSR-310 didasarkan pada nanodetik, bukan milidetik. Dengan demikian, set minimal metode yang masuk akal didasarkan pada jam, menit, detik dan nanodetik. Keputusan untuk memiliki basis nanodetik adalah salah satu keputusan awal proyek, dan yang saya yakini benar.
Menambahkan metode untuk milis akan tumpang tindih dengan nanosecond adalah cara yang tidak jelas. Pengguna harus memikirkan apakah bidang nano adalah nano-of-second atau nano-of-milli misalnya. Menambahkan metode tambahan yang membingungkan tidak diinginkan, sehingga metode itu dihilangkan. Seperti yang ditunjukkan, alternatifnya
get(MILLI_OF_SECOND)
tersedia.FWIW, saya akan menentang menambahkan
getMillis()
metode di masa depan.sumber
instant.getEpochSecond * 1000 + instant.getNano / 1000000
adalah boilerplate yang masuk akal untuk dapat berkomunikasi dengan legacy (pada saat ini, semua) Java API, Javascript, dll?Sebelum menjadi bagian dari openJDK, Threeten ada di github dan sebelum itu ada di sourceforge. Saat itu, Stephen Colebourne, yang merupakan pemimpin spesifikasi jsr-310, melakukan survei yang masih dapat Anda temukan di situs sourceforge .
hanya 6,23% memilih jawaban # 4 dan di antara mereka sekitar 15% meminta a
getMillis()
, yaitu kurang dari 1% dari total suara.Mungkin itulah sebabnya tidak ada
getMillis
di tempat pertama dan saya tidak dapat menemukan apa pun yang terkait pada mailing list openjdk sehingga masalah itu tampaknya tidak dibahas setelah itu.sumber
Kelas-kelas yang mewakili waktu UTC jelas (yaitu Instan, OffsetDateTime, ZonedDateTime) memiliki dua metode penolong untuk mengakses offset absolut dari zaman Java, yaitu apa yang Anda sebut 'waktu milidetik' di java.util.Date, yang dapat Anda gunakan untuk mendapatkan milidetik
Beberapa alasan mengapa ini telah dipilih dan bukannya
long getEpochMillis()
dibahas pada milis JSR 310 , beberapa di antaranya telah saya ekstrak untuk kenyamanan:Saya punya perasaan bahwa alasan lain adalah untuk sengaja membuat sulit untuk mengkonversi dari kelas java.util.Date ke JSR310, berharap bahwa pengembang akan mencoba untuk memahami perbedaan antara berbagai opsi dan tidak hanya secara membabi buta (salah) menggunakan kelas baru.
Mengenai mengapa
LocalDateTime
kelas tidak memiliki metode-metode tersebut - mereka tidak mungkin ada di sana karenaLocalDateTime
tidak terikat dengan timeline UTC sampai Anda memutuskan zona mana Anda berada atau apa offset UTC Anda, pada titik mana Anda memilikiOffsetDateTime
atauZonedDateTime
(keduanya memiliki metode yang diperlukan).Atau, Anda bisa menentukan
LOCAL_EPOCH
konstanta Anda sendiri1970-01-01T00:00:00
dan kemudian melakukan aMILLIS.between(LOCAL_EPOCH, localTime)
untuk mendapatkan semacam durasi dalam milidetik. Nilai ini, bagaimanapun, tidak akan kompatibel dengan nilai yang dikembalikan olehSystem.currentTimeMilliseconds()
ataujava.util.Date.getTime()
, kecuali tentu saja Anda menentukan waktu lokal Anda menjadi waktu UTC; tetapi dalam hal ini Anda mungkin juga menggunakan Instan secara langsung atau OffsetDateTime dengan ZoneOffset.UTC.sumber
getMillis
metode yang pada dasarnya akan kembaligetNanos()/1e6
- fakta bahwa itu bukan waktu yang instan tidak mencegahnya memiliki milidetik komponen.getMillis()
seperti pada getMillis-of-second; Anda berbicara tentang "milis sejak zaman". Yang pertama tidak ada sebagaimana dijelaskan dalam jawaban yang diterima. Yang terakhir sudah tersedia sebagaiInstant.toEpochMillis()
. Jadi, untuk aLocalDateTime
, Anda akan pergi:ldt.toInstant(offset).toEpochMillis()