Bagaimana cara mengonversi LocalDate menjadi Instan?

106

Saya bekerja dengan API DateTime Java 8 yang baru.

Bagaimana cara mengonversi LocalDate menjadi Instan? Saya mendapatkan pengecualian dengan

LocalDate date = LocalDate.of(2012, 2, 2);
Instant instant = Instant.from(date);

dan saya tidak mengerti mengapa.

pengguna1643352
sumber
Karena a LocalDatetidak menyertakan waktu.
OrangeDog

Jawaban:

98

The Instantkelas merupakan titik sesaat pada waktu-line. Konversi ke dan dari LocalDatemembutuhkan zona waktu. Tidak seperti beberapa pustaka tanggal dan waktu lainnya, JSR-310 tidak akan memilih zona waktu untuk Anda secara otomatis, jadi Anda harus menyediakannya.

LocalDate date = LocalDate.now();
Instant instant = date.atStartOfDay(ZoneId.systemDefault()).toInstant();

Contoh ini menggunakan zona waktu default JVM - ZoneId.systemDefault()- untuk melakukan konversi. Lihat di sini untuk jawaban yang lebih panjang untuk pertanyaan terkait.


Pembaruan: Penggunaan jawaban yang diterima LocalDateTime::toInstant(ZoneOffset)yang hanya menerima ZoneOffset. Jawaban ini menggunakan LocalDate::atStartOfDay(ZoneId)yang menerima apapun ZoneId. Dengan demikian, jawaban ini umumnya lebih berguna (dan mungkin harus diterima).

PS. Saya adalah penulis utama API

JodaStephen
sumber
1
Saya pikir ini lebih berguna daripada jawaban yang diterima karena ZoneId (zona waktu) adalah parameternya dan bukan ZoneOffset (jam bergeser dari UTC, yang dapat berubah untuk zona waktu di musim panas / musim dingin).
wuerg
1
Dalam pengujian unit yang saya tulis, saya memiliki LocalDate, yang diubah menjadi com.google.protobuf.Timestamp dan kemudian dipetakan kembali ke LocalDate melalui Instant, keduanya. Saat menggunakan pendekatan yang disarankan oleh jawaban yang diterima, saya mendapatkan LocalDate yang diharapkan sebagai gantinya, tetapi menggunakan pendekatan ini memberi saya "kemarin" kembali, bukan "hari ini". Zona waktu saya GMT + 1
Nadrendion
127

Untuk mengubahnya menjadi instan, Anda harus memiliki instance LocalDateTime, misalnya:

LocalDate.now().atStartOfDay().toInstant(ZoneOffset.UTC)
mdo
sumber
Terima kasih banyak. Saya mengerti sekarang bahwa saya perlu menentukan zona waktu untuk mendapatkan Instan.
pengguna1643352