2016-03-19 25 views
5

Tôi đang cố phân tích ngày của định dạng dd-MMM-yyyy.java.time.format.DateTimeParseException cho định dạng dd-MMM-yyyy

package com.company; 

import javax.swing.text.DateFormatter; 
import java.time.format.DateTimeFormatter; 

import java.time.*; 
import java.util.Locale; 

public class Main { 

    public static void main(String[] args) { 
     // write your code here 
     MonthDay m; 
     Locale.setDefault(Locale.ENGLISH); 
     DateTimeFormatter dTF = DateTimeFormatter.ofPattern("dd-MMM-yyyy"); 
     String dateString = "12-jan-1900"; 

     try 
     { 
      LocalDate ddd = LocalDate.parse(dateString,dTF); 
      System.out.println(ddd.toString()); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 

     //System.out.println(d.toString()); 

    } 
} 

Nó ném ngoại lệ sau

java.time.format.DateTimeParseException: Text '12-jan-1900' could not be parsed at index 3 
    at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949) 
    at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851) 
    at java.time.LocalDate.parse(LocalDate.java:400) 
    at com.company.Main.main(Main.java:20) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144) 

Nó phân tích tốt cho định dạng dd-MM-yyyy nhưng không thành công với định dạng dd-MMM-yyyy. Tôi mệt mỏi thiết lập Locale.US cũng có, nhưng nó không thành công trong trường hợp đó quá.

Trả lời

5

Lý do là phân tích cú pháp phân biệt chữ hoa chữ thường theo mặc định và trình định dạng không nhận dạng được "jan". Nó sẽ chỉ nhận ra "Jan".

Bạn có thể xây dựng một phân tích cú pháp case-insensitive bằng cách sử dụng một DateTimeFormatterBuilder và gọi parseCaseInsensitive():

Thay đổi phong cách phân tích cú pháp là trường hợp nhạy cảm đối với phần còn lại của định dạng.

Phân tích cú pháp có thể phân biệt chữ hoa chữ thường hoặc không nhạy cảm - theo mặc định, phân biệt chữ hoa chữ thường. Phương pháp này cho phép cài đặt độ phân giải chữ hoa chữ thường được thay đổi.

DateTimeFormatter dTF = 
    new DateTimeFormatterBuilder().parseCaseInsensitive() 
            .appendPattern("dd-MMM-yyyy") 
            .toFormatter(); 
+1

Thật là một mớ hỗn độn. Và Oracle từ chối cải tiến ở đây, xem [JDK-bug-log] này (https://bugs.openjdk.java.net/browse/JDK-8141245) –

Các vấn đề liên quan