Bagaimana cara mengekstrak nilai epoch Long
dari contoh LocalDateTime
atau LocalDate
? Saya sudah mencoba yang berikut ini, tetapi memberi saya hasil lain:
LocalDateTime time = LocalDateTime.parse("04.02.2014 19:51:01", DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss"));
System.out.println(time.getLong(ChronoField.SECOND_OF_DAY)); // gives 71461
System.out.println(time.getLong(ChronoField.EPOCH_DAY)); // gives 16105
Yang saya inginkan hanyalah nilai 1391539861
untuk tanggal waktu lokal "04.02.2014 19:51:01"
. Zona waktu saya Europe/Oslo
UTC + 1 dengan waktu musim panas.
LocalDateTime
selain menghitungnya secara manual?Jawaban:
Kelas
LocalDate
danLocalDateTime
tidak berisi informasi tentang zona waktu atau perbedaan waktu , dan detik sejak zaman akan menjadi ambigu tanpa informasi ini. Namun, objek memiliki beberapa metode untuk mengubahnya menjadi objek tanggal / waktu dengan zona waktu dengan melewatkan sebuahZoneId
instance.LocalDate
LocalDateTime
sumber
ZoneId.ofOffset("UTC", ZoneOffset.ofHours(0))
long epoch = time.toEpochSecond(ZoneOffset.UTC)
untuk kasus UTC, atau di mana Anda sudah mengetahui zona waktunya, ataulong epoch = time.toEpochSecond(ZoneId.systemDefault());
jika Anda ingin pergi ke rute itu.Instant.ofEpochMilli(responseTime).atZone(ZoneId.systemDefault()).toLocalTime()
'Milidetik sejak zaman unix' mewakili sekejap, jadi Anda harus menggunakan kelas Instan:
sumber
ZoneId.systemDefault()
karena unix epoch mengacu pada UTCKonversi yang Anda butuhkan membutuhkan pengimbangan dari UTC / Greewich, atau zona waktu.
Jika Anda telah offset, ada metode khusus pada
LocalDateTime
untuk tugas ini:Jika Anda hanya memiliki
ZoneId
maka Anda dapat memperolehnyaZoneOffset
dariZoneId
:Tetapi Anda mungkin menemukan konversi melalui yang
ZonedDateTime
lebih sederhana:sumber
long epochSec = localDateTime.toEpochSecond(ZoneOffset.UTC);
Lihat metode ini untuk melihat bidang mana yang didukung. Anda akan menemukan untuk
LocalDateTime
:Bidang INSTANT_SECONDS - tentu saja - tidak didukung karena
LocalDateTime
tidak dapat merujuk ke stempel waktu absolut (global). Tetapi yang membantu adalah bidang EPOCH_DAY yang menghitung hari yang telah berlalu sejak 1970-01-01. Pemikiran serupa berlaku untuk jenisnyaLocalDate
(bahkan dengan bidang yang kurang didukung).Jika Anda bermaksud untuk mendapatkan bidang milis-sejak-unix-epoch yang tidak ada, Anda juga memerlukan zona waktu untuk mengonversi dari tipe lokal ke global. Konversi ini dapat dilakukan dengan lebih sederhana, lihat posting SO lainnya .
Kembali ke pertanyaan Anda dan nomor dalam kode Anda:
16105L * 86400 + 71461 = 1391543461 detik sejak 1970-01-01T00: 00: 00 (perhatian, tidak ada zona waktu) Kemudian Anda dapat mengurangi offset zona waktu (hati-hati terhadap kemungkinan perkalian 1000 jika dalam milidetik).
UPDATE setelah info zona waktu diberikan:
Sebagai kode JSR-310 dengan dua pendekatan yang setara:
sumber
LocalDateTime time = LocalDateTime.parse("04.02.2014 19:51:01", DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss"));
laluLong epoch = time.atZone(ZoneId.of("Europe/Oslo")).toEpochSecond();
.Konversi dari tanggal yang dapat dibaca manusia ke zaman :
Ubah dari epoch ke tanggal yang dapat dibaca manusia :
Untuk pengubah bahasa lainnya: https://www.epochconverter.com
sumber
Ini adalah satu cara tanpa menggunakan zona waktu:
sumber