Saya bertanya-tanya apakah ada cara untuk mendapatkan milidetik saat ini sejak 1-1-1970 (zaman) menggunakan yang baru LocalDate
, LocalTime
atau LocalDateTime
kelas Java 8.
Cara yang dikenal di bawah ini:
long currentMilliseconds = new Date().getTime();
atau
long currentMilliseconds = System.currentTimeMillis();
System.currentTimeMillis()
?currentTimeMillis
tidak akan relevan dalam konteks itu. Pikirkan Kalender + Jam Dinding dengan presisi yang sangat baik, dan tidak ada kekhawatiran tentang zona waktu dan lokalitas. Jadi tidak ada cara untuk kembali ke "Waktu UTC" dari LocalTimeJawaban:
Saya tidak sepenuhnya yakin apa yang Anda maksud dengan "milidetik saat ini" tetapi saya akan menganggap itu adalah jumlah milidetik sejak "zaman", yaitu tengah malam, 1 Januari 1970 UTC.
Jika Anda ingin menemukan jumlah milidetik sejak zaman sekarang, maka gunakan
System.currentTimeMillis()
seperti yang ditunjukkan Anubian Noob . Jika demikian, tidak ada alasan untuk menggunakan API java.time baru untuk melakukan ini.Namun, mungkin Anda sudah memiliki
LocalDateTime
objek serupa dari suatu tempat dan Anda ingin mengubahnya menjadi milidetik sejak zamannya. Tidak mungkin untuk melakukan itu secara langsung, karenaLocalDateTime
keluarga objek tidak memiliki gagasan tentang zona waktu mereka. Dengan demikian, informasi zona waktu perlu diberikan untuk menemukan waktu relatif terhadap zaman, yaitu di UTC.Misalkan Anda memiliki yang
LocalDateTime
seperti ini:Anda perlu menerapkan informasi zona waktu, memberikan a
ZonedDateTime
. Saya berada di zona waktu yang sama dengan Los Angeles, jadi saya akan melakukan sesuatu seperti ini:Tentu saja, ini membuat asumsi tentang zona waktu. Dan ada kasus tepi yang dapat terjadi, misalnya, jika waktu lokal kebetulan menyebutkan waktu di dekat transisi Daylight Saving Time (Summer Time). Mari kita kesampingkan ini, tetapi Anda harus menyadari bahwa kasus ini ada.
Bagaimanapun, jika Anda bisa mendapatkan yang valid
ZonedDateTime
, Anda dapat mengonversinya ke jumlah milidetik sejak zaman, seperti:sumber
getEpochSecond
metode (melalui ChronoZonedDateTime bawaan ). Tidak perlu untukInstant
.zdt.toInstant().toEpochMilli();
akan memberi Anda milidetik untuk nilai UTC yang sesuai , bukan untuk waktu tanggal yang dikategorikan. Saya menemukan ini dengan cara yang sulit.toInstant()
memberi Anda UTC instan. Jika Anda ingin waktu lokal dalam millis, ini tidak akan memberi Anda apa yang Anda harapkan . Jadi, jika Anda mis menggunakan waktu +02: 00 zona waktu, waktu pengembalian Anda akan 3600 * 2 * 1000 milidetik kurang dari apa yang Anda harapkan.ZonedDateTime.now().toInstant().toEpochMilli()
,LocalDateTime.now().toInstant(OffsetDateTime.now().getOffset()).toEpochMilli()
,LocalDateTime.now().toInstant(ZoneOffset.UTC).toEpochMilli()
,Calendar.getInstance().getTime().getTime()
,new Date().getTime()
danSystem.currentTimeMillis()
. Satu-satunya metode yang tampaknya "mati" adalah yang Anda usulkan:LocalDateTime.now().toInstant(ZoneOffset.UTC).toEpochMilli()
memberi Anda mili untuk tanggal lokal Anda seolah-olah itu adalah tanggal UTC , yaitu jika tanggal lokal adalah UTC + 2 metode Anda memberikan mili selama 2 jam di masa depan .Apa yang saya lakukan sehingga saya tidak menentukan zona waktu adalah,
memberi
Seperti yang Anda lihat angka-angkanya sama kecuali untuk waktu eksekusi yang kecil.
Kalau-kalau Anda tidak suka System.currentTimeMillis, gunakan
Instant.now().toEpochMilli()
sumber
Untuk menghindari ZoneId yang dapat Anda lakukan:
Mendapatkan 0 sebagai nilai, itu benar!
sumber
ZoneOffset.ofTotalSeconds(0)
itu sama denganZoneOffset.UTC
ZoneOffset
adalah subkelas dariZoneId
, jadi saya tidak akan persis mengatakan Anda telah menghindarinya, tetapi selama Anda bahagia ...ZoneId
?Karena Java 8 Anda dapat menelepon
java.time.Instant.toEpochMilli()
.Misalnya panggilan
memberi Anda hasil yang sama dengan
sumber
Anda dapat menggunakan
java.sql.Timestamp
juga untuk mendapatkan milidetik.sumber
Timestamp
kelas sudah lama usang dan penuh dengan masalah desain, jadi saya lebih suka menghindarinya, terutama ketika kita bisa menggunakan kelas darijava.time
sukaLocalDateTime
.Timestamp
, Bisakah Anda berbagi beberapa artikel tentang itu? Ini membantu saya untuk menghindari menggunakanTimestamp
kode saya juga. Terima kasih!Date
tetapi seringkali tidak dapat ditangani sebagaiDate
. Sebagian besar metode yang diwarisi dariDate
dan satu konstruktor sudah usang. ItstoString
metode menggunakan zona waktu JVM, yang membingungkan banyak karena samaTimestamp
dicetak berbeda pada komputer yang berbeda ( misalnya ).LocalDate.of(year, month, day)
Untuk mendapatkan waktu saat ini dalam milidetik (sejak zamannya), gunakan
System.currentTimeMillis()
.sumber
Jika Anda memiliki Jam Java 8, maka Anda dapat menggunakan
clock.millis()
(meskipun itu menyarankan Anda gunakanclock.instant()
untuk mendapatkan Java 8 Instan, karena lebih akurat).Mengapa Anda menggunakan jam Java 8? Jadi dalam kerangka DI Anda, Anda dapat membuat kacang Clock:
dan kemudian dalam tes Anda, Anda dapat dengan mudah mengejeknya:
atau Anda dapat memiliki kacang yang berbeda:
yang membantu dengan tes yang menyatakan tanggal dan waktu tak terukur.
sumber
sumber
Mengapa tidak ada yang menyebutkan metode ini
LocalDateTime.toEpochSecond()
:Tampaknya ini jauh lebih pendek daripada banyak jawaban yang disarankan di atas ...
sumber
toEpochMilli
metode, memperhitungkan fakta bahwa Anda dapat menentukan bahkan nanodetik di LocalDateTime: ada metodeLocalDateTime.of(int year, int month, int dayOfMonth, int hour, int minute, int second, int nanoOfSecond)
.