2010-02-08 4 views
34

tôi đã cố gắngLàm thế nào để phân tích cú pháp chuỗi tháng đầy đủ bằng cách sử dụng DateFormat trong Java?

DateFormat fmt = new SimpleDateFormat("MMMM dd, yyyy"); 
    Date d = fmt.parse("June 27, 2007"); 

Exception in thread "main" java.text.ParseException: Unparseable date: "June 27, 2007"

Các java docs nói rằng tôi nên sử dụng bốn nhân vật để phù hợp với hình thức đầy đủ. Tôi chỉ có thể sử dụng MMM thành công với các tháng viết tắt như "Jun" nhưng tôi cần phải khớp với biểu mẫu đầy đủ.

Văn bản: Để định dạng, nếu số chữ hoa văn là 4 hoặc nhiều hơn, thì sử dụng dạng đầy đủ; nếu không, hãy sử dụng mẫu hoặc viết tắt ngắn nếu sử dụng . Để phân tích cú pháp, cả hai biểu mẫu được chấp nhận là , độc lập với số lượng chữ cái mẫu.

http://java.sun.com/j2se/1.6.0/docs/api/java/text/SimpleDateFormat.html

+2

Bạn có hai dấu cách trong chuỗi ngày của mình. –

+0

Bạn có chắc chắn đang sử dụng Java 6 không? Hai dòng mã bạn dán đã làm việc tốt cho tôi; không có ngoại lệ. – aberrant80

Trả lời

88

Bạn đang thể sử dụng một miền địa phương nơi các tên tháng không phải là "tháng một", "tháng hai", vv nhưng một số từ khác trong ngôn ngữ địa phương của bạn.

Cố gắng xác định miền địa phương bạn muốn sử dụng, ví dụ Locale.US:

DateFormat fmt = new SimpleDateFormat("MMMM dd, yyyy", Locale.US); 
Date d = fmt.parse("June 27, 2007"); 

Ngoài ra, bạn có một không gian thêm trong chuỗi ngày, nhưng thực tế này không ảnh hưởng đến kết quả. Nó hoạt động theo một trong hai cách.

+0

do đó, không gian thêm có một số ảnh hưởng trong lỗi phân tích cú pháp không? –

+0

@Beau Martínez: Không, điều đó không có tác dụng gì cả. Tôi đã cập nhật nhận xét của tôi để giải quyết vấn đề đó vì nó đã được đưa lên không chỉ bởi bạn mà còn bởi những người khác trong các nhận xét. –

2

Chỉ cần để đầu này lên đến mới Java 8 API:

DateTimeFormatter formatter = new DateTimeFormatterBuilder().appendPattern("MMMM dd, yyyy").toFormatter(); 
TemporalAccessor ta = formatter.parse("June 27, 2007"); 
Instant instant = LocalDate.from(ta).atStartOfDay().atZone(ZoneId.systemDefault()).toInstant(); 
Date d = Date.from(instant); 
assertThat(d.getYear(), is(107)); 
assertThat(d.getMonth(), is(5)); 

Một chút tiết hơn, nhưng bạn cũng thấy rằng các phương pháp của ngày sử dụng còn hiệu lực nữa ;-) Thời gian để di chuyển trên.