Saya memiliki API eksternal yang mengembalikan saya tanggal sebagai long
s, diwakili sebagai milidetik sejak awal Zaman.
Dengan Java API gaya lama, saya hanya akan membangun Date
dari dengannya
Date myDate = new Date(startDateLong)
Apa yang setara di Java 8 LocalDate
/ LocalDateTime
kelas?
Saya tertarik mengonversi titik waktu yang diwakili oleh long
ke LocalDate
dalam zona waktu lokal saya saat ini.
java.util.Date
itu tidak pernah benar-benar kencan dengan cara yangLocalDate
- itu instan dalam waktu juga.java.util.Date
menjadiLocalDate
File.lastModified()
(zaman millis) keLocalDate(Time)
.Jawaban:
Jika Anda memiliki milidetik sejak Zaman dan ingin mengubahnya menjadi tanggal lokal menggunakan zona waktu setempat saat ini, Anda dapat menggunakan
tetapi perlu diingat bahwa bahkan zona waktu standar sistem dapat berubah, sehingga nilai yang sama
long
dapat menghasilkan hasil yang berbeda dalam proses selanjutnya, bahkan pada mesin yang sama.Lebih jauh, ingatlah bahwa
LocalDate
, tidak sepertijava.util.Date
, benar-benar mewakili tanggal, bukan tanggal dan waktu.Jika tidak, Anda dapat menggunakan
LocalDateTime
:sumber
LocalDateTime.ofEpochSecond(…)
membutuhkan aktualZoneOffset
, tetapiZoneId.systemDefault()
mengembalikan aZoneId
. CanZoneId
dapat memetakan ke offset yang berbeda, tergantung pada titik waktu yang Anda maksud. Itulah yangLocalDateTime.ofInstant
Anda lakukan, mengonversi yang ditentukanZoneId
sesuai dengan yang disediakanInstant
.LocalDate
atauLocalDateTime
. Anda dapat menentukan zona waktu yang Anda inginkan, asalkan konsisten dengan penggunaan objek hasil selanjutnya. Pikirkan apa yang terjadi ketika Anda berurusan dengan banyak objek yang dibuat dengan metode yang berbeda. Kasing yang umum digunakan untuk tanggal atau datetimes lokal menggabungkan zona waktu default sistem, misalnyaLocalDateTime.now()
≈LocalDateTime.ofInstant(Instant.ofEpochMilli(System.currentTimeMillis()), ZoneId.systemDefault())
…Anda bisa mulai dengan Instant.ofEpochMilli (panjang) :
sumber
Saya pikir saya punya jawaban yang lebih baik.
sumber
Timestamp
kelas buruk dirancang dan panjang usang. Kode Anda akan menggunakan pengaturan zona waktu JVM, tetapi karena pengaturan ini dapat diubah oleh bagian lain dari program Anda atau program lain yang berjalan di JVM yang sama, kami tidak dapat memastikan apa itu.Zona waktu dan hal-hal samping, alternatif yang sangat sederhana untuk
new Date(startDateLong)
bisaLocalDate.ofEpochDay(startDateLong / 86400000L)
sumber
java.time
tidak termasukDateTimeConstants
Joda.java.util.concurrent.TimeUnit.MILLISECONDS.toDays(startDateLong)
ganti now.getTime () dengan nilai lama Anda.
sumber
Dalam kasus tertentu di mana cap waktu detik Anda berasal dari SQL atau terkait dengan SQL, Anda dapat memperolehnya seperti ini:
sumber
LocalDate
dariepoch-millis
", dan saya menunjukkan caranya, menggunakanjava.sql.Date
singkatan. Pendekatan ini masuk akal dalam kode yang sudah berurusan dengan JDBC dalam beberapa kapasitas, dan itu berfungsi dengan baik. Jika Anda masih belum yakin, jelaskan bagaimana hal itu tidak terkait dengan pertanyaan awal.java.sql.Date
pendekatan adalah salah satu yang tersingkat, bijaksana kode, dan saya akan mengatakan itu tidak terlalu berguna untuk pergi meskipunInstant
dengan semua objek sementara sementara ketika hasil akhirnya sama.