2011-01-18 85 views
11

Tôi cần phải phân tích các ngày của định dạng "ngày 10 tháng 1 năm 2010" trong Java. Tôi có thể làm cái này như thế nào?Phân tích ngày tháng của định dạng "ngày 10 tháng 1 năm 2010" trong Java? (với các chỉ số thứ tự, st | nd | rd | th)

Cách xử lý ordinal indicators, st, nd, rd hoặc th theo sau số ngày?

+2

Vấn đề là "th" (và có lẽ là "thứ" và "nd"), phải không? – Thilo

+0

Thanx mọi người ... nó hoạt động bằng cách thoát khỏi các nhân vật. – srinivasarao

Trả lời

9

này hoạt động:

String s = "January 10th, 2010"; 
DateFormat dateFormat = new SimpleDateFormat("MMM dd yyyy"); 
System.out.println("" + dateFormat.parse(s.replaceAll("(?:st|nd|rd|th),", ""))); 

nhưng bạn cần phải chắc chắn rằng bạn đang sử dụng quyền Locale để phân tích đúng vào tên tháng.

Tôi biết bạn có thể bao gồm các văn bản chung bên trong mẫu SimpleDateFormat. Tuy nhiên trong trường hợp này, văn bản phụ thuộc vào thông tin và thực sự không liên quan đến quá trình phân tích cú pháp.

Đây thực sự là giải pháp đơn giản nhất mà tôi có thể nghĩ đến. Nhưng tôi rất thích được hiển thị sai.

Bạn có thể tránh những cạm bẫy tiếp xúc trong một trong những ý kiến ​​bằng cách làm một cái gì đó tương tự như sau:

String s = "January 10th, 2010"; 
DateFormat dateFormat = new SimpleDateFormat("MMM dd yyyy"); 
System.out.println("" + dateFormat.parse(s.replaceAll("(?<= \\d+)(?:st|nd|rd|th),(?= \\d+$)", ""))); 

này sẽ cho phép bạn không phù hợp Jath,uary 10 2010 ví dụ.

+2

tôi biết bạn có thể bao gồm các văn bản chung bên trong mẫu 'SimpleDataFormat'. Tuy nhiên trong trường hợp này, văn bản phụ thuộc vào thông tin và thực sự không liên quan đến quá trình phân tích cú pháp. Giải pháp đơn giản nhất mà tôi biết là đây. Nhưng tôi rất thích được hiển thị sai. –

+0

Hoạt động ngay cả đối với 'August'. ;-) –

+0

@Michael ... tốt để biết. –

1

Bạn có thể đặt nd vv làm chữ trong số SimpleDateFormat. Bạn có thể xác định bốn định dạng cần thiết và thử chúng. Bắt đầu với th trước tiên, bởi vì tôi đoán điều này sẽ xảy ra thường xuyên hơn. Nếu nó không thành công với ParseException, hãy thử cái tiếp theo. Nếu tất cả thất bại, hãy ném ParseException. Mã ở đây chỉ là một khái niệm. Trong thực tế, bạn có thể sẽ không tạo ra các định dạng mới mọi lúc và có thể nghĩ về an toàn luồng.

public static Date hoolaHoop(final String dateText) throws ParseException 
     { 
     ParseException pe=null; 
     String[] sss={"th","nd","rd","st"}; 
     for (String special:sss) 
     { 
     SimpleDateFormat sdf=new SimpleDateFormat("MMMM d'"+special+",' yyyy"); 

     try{ 
     return sdf.parse(dateText); 
     } 
     catch (ParseException e) 
     { 
     // remember for throwing later 
     pe=e; 
     } 
     } 
     throw pe; 
     } 
     public static void main (String[] args) throws java.lang.Exception 
     { 
     String[] dateText={"January 10th, 2010","January 1st, 2010","January 2nd, 2010",""}; 
     for (String dt:dateText) {System.out.println(hoolaHoop(dt))}; 
     } 

Output:

Sun 10 tháng 1 00:00:00 GMT 2010

Fri Jan 01 00:00:00 GMT 2010

Sat 02 tháng 1 00:00: 00 GMT 2010

Ngoại lệ trong chuỗi "chính" java.text.ParseException: Ngày không thể chia sẻ: ""

"th","nd","rd","st" tất nhiên chỉ phù hợp với ngôn ngữ tiếng Anh. Ghi nhớ nó trong tâm trí. Ở Pháp, "re","nd" vâng tôi đoán vậy.

0

Đây là một cách dễ dàng khác, nhưng cần phải bao gồm apache commons jar.

import org.apache.commons.lang.time.*; 

String s = "January 10th, 2010"; 
String[] freakyFormat = {"MMM dd'st,' yyyy","MMM dd'nd,' yyyy","MMM dd'th,' yyyy","MMM dd'rd,' yyyy"}; 
DateUtils du = new DateUtils(); 
System.out.println("" + du.parseDate(s,freakyFormat)); 
Các vấn đề liên quan