tl; dr
LocalDate.parse(
"01-23-2017" ,
DateTimeFormatter.ofPattern( "MM-dd-uuuu" )
)
Chi tiết
Tôi có java.util.Date ở định dạng yyyy-mm-dd
Như đã đề cập khác, Date
lớp không có định dạng. Nó có số đếm mili giây kể từ đầu năm 1970 theo giờ UTC. Không có chuỗi đính kèm.
java.time
Các câu trả lời khác sử dụng các lớp ngày-giờ kế thừa cũ rắc rối, hiện được thay thế bằng các lớp java.time.
Nếu bạn có java.util.Date
, hãy chuyển đổi thành một Instant
đối tượng. Các Instant
lớp đại diện cho một thời điểm trên Timeline trong UTC với độ phân giải nano giây (lên đến chín (9) chữ số của một phân số thập phân).
Instant instant = myUtilDate.toInstant();
Múi giờ
Các câu trả lời khác bỏ qua vấn đề quan trọng của múi giờ. Xác định ngày tháng cần có múi giờ. Đối với bất kỳ thời điểm nhất định nào, ngày thay đổi trên toàn cầu theo khu vực. Vài phút sau nửa đêm ở Paris Pháp là một ngày mới, trong khi vẫn là “ngày hôm qua” ở Montréal Québec.
Xác định múi giờ mà bạn muốn có ngữ cảnh cho của mình Instant
.
ZoneId z = ZoneId.of( "America/Montreal" );
Áp dụng ZoneId
để có được a ZonedDateTime
.
ZonedDateTime zdt = instant.atZone( z );
LocalDate
Nếu bạn chỉ quan tâm đến ngày mà không có thời gian trong ngày, hãy trích xuất a LocalDate
.
LocalDate localDate = zdt.toLocalDate();
Để tạo một chuỗi ở định dạng ISO 8601 tiêu chuẩn, YYYY-MM-DD, chỉ cần gọi toString
. Các lớp java.time sử dụng các định dạng chuẩn theo mặc định khi tạo / phân tích cú pháp chuỗi.
String output = localDate.toString();
2017-01-23
Nếu bạn muốn định dạng MM-DD-YYYY, hãy xác định một mẫu định dạng.
DateTimeFormatter f = DateTimeFormatter.ofPattern( "MM-dd-uuuu" );
String output = localDate.format( f );
Lưu ý rằng mã mẫu định dạng phân biệt chữ hoa chữ thường. Mã trong Câu hỏi được sử dụng không chính xác mm
(phút của giờ) thay vì MM
(tháng trong năm).
Sử dụng cùng một DateTimeFormatter
đối tượng để phân tích cú pháp. Các lớp java.time là luồng an toàn, vì vậy bạn có thể giữ đối tượng này xung quanh và tái sử dụng nó nhiều lần ngay cả trên các luồng.
LocalDate localDate = LocalDate.parse( "01-23-2017" , f );
Giới thiệu về java.time
Các java.time khung được xây dựng vào Java 8 và sau đó. Những lớp học thay thế cái cũ phiền hà di sản lớp học ngày thời gian như java.util.Date
, Calendar
, & SimpleDateFormat
.
Các Joda thời gian dự án, bây giờ trong chế độ bảo trì , khuyên chuyển đổi sang các java.time lớp.
Để tìm hiểu thêm, hãy xem Hướng dẫn Oracle . Và tìm kiếm Stack Overflow cho nhiều ví dụ và giải thích. Đặc điểm kỹ thuật là JSR 310 .
Lấy các lớp java.time ở đâu?
- Java SE 8 và SE 9 trở lên
- Được xây dựng trong.
- Một phần của API Java tiêu chuẩn với một triển khai đóng gói.
- Java 9 bổ sung một số tính năng nhỏ và các bản sửa lỗi.
- Java SE 6 và SE 7
- Phần lớn chức năng của java.time được chuyển ngược sang Java 6 & 7 trong ThreeTen-Backport .
- Android
Các ThreeTen-Extra dự án mở rộng java.time với các lớp bổ sung. Dự án này là cơ sở chứng minh cho những bổ sung có thể có trong tương lai cho java.time. Bạn có thể tìm thấy một số các lớp học hữu ích ở đây chẳng hạn như Interval
, YearWeek
, YearQuarter
, và nhiều hơn nữa .