Chuỗi đến LocalDate


102

Làm cách nào để chuyển đổi một chuỗi thành một chuỗi ký tự LocalDate?

Tôi đã thấy các ví dụ như:

LocalDate dt = new LocalDate("2005-11-12");

Nhưng chuỗi của tôi giống như:

2005-nov-12

Câu trả lời:


78

Khi bạn sử dụng Joda Time, bạn nên sử dụng DateTimeFormatter:

final DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MMM-dd");
final LocalDate dt = dtf.parseLocalDate(yourinput);

Nếu sử dụng Java 8 trở lên, hãy tham khảo câu trả lời của hertzi


Cũng đã gửi bản chỉnh sửa cho định dạng "yyyy-MMM-dd". YYYY là năm của thời đại, và (nghiêm túc hơn) DD là ngày trong năm.
Spencer Kormos

câu trả lời hơi sai ... đối với thời gian joda, lớp để sử dụng là DateTimeFormat, không phải DateTimeFormatter. Nói cách khác, hãy gọi DateTimeFormat.ofPattern ("yyyy-MM-dd"). ParseLocalDate (yourInput);
Dan Haywood

188

java.time

Kể từ Java 1.8, bạn có thể đạt được điều này mà không cần thêm thư viện bằng cách sử dụng các lớp java.time . Xem Hướng dẫn .

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MMM-dd");
formatter = formatter.withLocale( putAppropriateLocaleHere );  // Locale specifies human language for translating, and cultural norms for lowercase/uppercase and abbreviations and such. Example: Locale.US or Locale.CANADA_FRENCH
LocalDate date = LocalDate.parse("2005-nov-12", formatter);

Mặc dù vậy, cú pháp gần giống nhau.


java.time.format.DateTimeParseException: Không thể phân tích cú pháp văn bản '2005-nov-12' ở chỉ mục 5
Atte Juvonen

3
Điều này xảy ra vì Ngôn ngữ mặc định của bạn mong đợi chữ 'N' của 'Tháng 11' là chữ hoa.
hertzi

Xem Câu trả lời của tôi cho một Câu hỏi tương tự để thảo luận thêm về phương pháp này.
Basil Bourque

14

Bạn có thể phải chuyển từ DateTime sang LocalDate.

Sử dụng Joda Time:

DateTimeFormatter FORMATTER = DateTimeFormat.forPattern("yyyy-MMM-dd");
DateTime dateTime = FORMATTER.parseDateTime("2005-nov-12");
LocalDate localDate = dateTime.toLocalDate();

2
Lưu ý rằng câu trả lời này đề cập đến Joda, không phải Java SE.
DavidS

9

Định dạng ngày giờ được thực hiện bởi org.joda.time.format.DateTimeFormatter class. Ba lớp cung cấp các phương thức gốc để tạo các bộ định dạng và đây là một. Những người khác là ISODateTimeFormatDateTimeFormatterBuilder.

DateTimeFormatter format = DateTimeFormat.forPattern("yyyy-MMM-dd");
LocalDate lDate = new LocalDate().parse("2005-nov-12",format);

final org.joda.time.LocalDate classlà một lớp datetime bất biến đại diện cho một ngày không có múi giờ . LocalDatethread-safe và bất biến , với điều kiện Niên là là tốt. Tất cả các lớp Chronology tiêu chuẩn được cung cấp đều an toàn theo luồng và không thay đổi.


1

DateTimeFormatter có các định dạng được tạo sẵn có thể được sử dụng trực tiếp để phân tích một chuỗi ký tự. Phân biệt chữ hoa chữ thường, tháng 11 sẽ hoạt động tuy nhiên nov và NOV sẽ không hoạt động:

DateTimeFormatter pattern = DateTimeFormatter.ofPattern("yyyy-MMM-dd");

try {
    LocalDate datetime = LocalDate.parse(oldDate, pattern);
    System.out.println(datetime); 
} catch (DateTimeParseException e) {
    // DateTimeParseException - Text '2019-nov-12' could not be parsed at index 5
    // Exception handling message/mechanism/logging as per company standard
}

DateTimeFormatterBuildercung cấp cách tùy chỉnh để tạo một định dạng. Nó không phân biệt chữ hoa chữ thường, tháng 11, tháng 11 và tháng 11 sẽ được coi như nhau.

DateTimeFormatter f = new DateTimeFormatterBuilder().parseCaseInsensitive()
        .append(DateTimeFormatter.ofPattern("yyyy-MMM-dd")).toFormatter();
try {
    LocalDate datetime = LocalDate.parse(oldDate, f);
    System.out.println(datetime); // 2019-11-12
} catch (DateTimeParseException e) {
     // Exception handling message/mechanism/logging as per company standard
}

1
Chào mừng bạn đến với SO, chúng tôi đánh giá cao ý kiến ​​đóng góp của bạn! Vui lòng chỉnh sửa câu trả lời của bạn và cung cấp thêm một chút giải thích, cách nó liên quan đến câu hỏi, bạn lấy giải pháp của mình từ đâu, tại sao nó hoạt động? Để biết thêm hướng dẫn, hãy xem stackoverflow.com/help/how-to-answer
B - rian
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.