Làm thế nào để chuyển đổi LocalDate thành Instant?


106

Tôi làm việc với API DateTime mới của Java 8.

Làm thế nào để chuyển đổi LocalDate thành Instant? Tôi nhận được một ngoại lệ với

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

và tôi không hiểu tại sao.


Bởi vì a LocalDatekhông bao gồm thời gian.
OrangeDog

Câu trả lời:


97

Các Instantlớp đại diện cho một điểm tức thời vào thời gian trực tuyến. Chuyển đổi đến và từ một LocalDateyêu cầu một múi giờ. Không giống như một số thư viện ngày và giờ khác, JSR-310 sẽ không tự động chọn múi giờ cho bạn, vì vậy bạn phải cung cấp múi giờ.

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

Ví dụ này sử dụng múi giờ mặc định của JVM - ZoneId.systemDefault()- để thực hiện chuyển đổi. Xem ở đây để có câu trả lời dài hơn cho một câu hỏi liên quan.


Cập nhật: Câu trả lời được chấp nhận sử dụng câu trả lời LocalDateTime::toInstant(ZoneOffset)chỉ chấp nhận ZoneOffset. Câu trả lời này sử dụng LocalDate::atStartOfDay(ZoneId)mà chấp nhận bất kỳ ZoneId. Như vậy, câu trả lời này thường hữu ích hơn (và có lẽ nên là câu được chấp nhận).

Tái bút. Tôi là tác giả chính của API


1
Tôi nghĩ đây là câu trả lời hữu ích hơn câu trả lời được chấp nhận vì ZoneId (múi giờ) là tham số chứ không phải ZoneOffset (giờ được chuyển từ UTC, có thể thay đổi múi giờ vào mùa hè / mùa đông).
wuerg

1
Trong bài kiểm tra đơn vị mà tôi đang viết, tôi có LocalDate, được chuyển đổi thành com.google.protobuf.Timestamp và sau đó được ánh xạ trở lại LocalDate qua Instant, theo cả hai cách. Khi sử dụng cách tiếp cận mà câu trả lời được chấp nhận đề xuất, đổi lại tôi sẽ nhận được LocalDate như mong đợi, nhưng việc sử dụng phương pháp này đưa tôi về "ngày hôm qua" thay vì "hôm nay". Múi giờ của tôi là GMT + 1
Nadrendion

127

Để chuyển đổi nó thành tức thì, bạn cần có một phiên bản LocalDateTime, ví dụ:

LocalDate.now().atStartOfDay().toInstant(ZoneOffset.UTC)

Cảm ơn rất nhiều. Bây giờ tôi hiểu rằng tôi cần chỉ định múi giờ để nhận Instant.
user1643352
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.