2011-08-05 35 views
5

Cách tốt nhất để phân tích cú pháp ngày trong Java là gì? Có cách nào được xây dựng để phân tích cú pháp các chuỗi như "18 tháng 7 năm 2011", "ngày 18 tháng 7 năm 2011", "18-07-2011", "2011-07-18" mà không biết định dạng trước không?Cách chung để phân tích các ngày trong Java

+0

Từ "phân tích" ngụ ý quan hệ cú pháp. Để "phân tích cú pháp" bất cứ điều gì có ý nghĩa, cú pháp là phải. – pavanlimo

Trả lời

1

Nếu bạn đã quen thuộc với các Simpledateformat bạn chỉ có thể thêm một vài dateformatter trong một danh sách/mảng và làm tất cả sau khi khác cho đến khi một truy cập một ngày hợp lệ.

Vấn đề ở đây là: Bạn sẽ làm gì với một ngày như

06-07-2011

Có 06 Tháng bảy hoặc là nó ngày 07 tháng sáu?

Nhưng để trả lời câu hỏi: không có "cách tổng quát được xây dựng"

0

Bạn thực sự không thể làm điều đó. Xem xét "10-12-2011". Bạn có nghĩa là 10 tháng mười hai hoặc 12 tháng mười? Bạn cần tạo danh sách mẫu riêng của mình để thử. Danh sách này sẽ thay đổi tùy theo ngôn ngữ và cách "dự kiến" của người nào đó ở quốc gia/miền địa phương đó sẽ giải thích ngày tháng.

2

Không thực sự. BalusC đã viết một bài đăng tuyệt vời trên DateUtil, rằng "giải quyết" hầu hết các định dạng ngày phân tích cú pháp.

+0

Giải pháp tốt nhưng không xem xét tz theo định dạng ngày –

+0

@Merson Moretto, câu hỏi của OP không bao gồm Múi giờ. –

0

Bạn có thể sử dụng DateFormat.parse(...) và sử dụng ngôn ngữ cho định dạng ngày, nhưng điều đó vẫn không thể xử lý tất cả các trường hợp đó. Nó cũng không dễ dàng như vậy: hãy xem xét hai ngày có thể sau đây (giống nhau): 18/07/201107/18/2011 - cách phân tích cú pháp đó mà không biết liệu đó có phải là dd/mm/yyyy hoặc mm/dd/yyyy (ví dụ: Saudi Arabia)?

0

Đây là vấn đề lớn, chủ yếu là do ngày tháng là khái niệm mờ - ví dụ: 02-01-2012 vào tháng 2 hoặc tháng 1?

Điều tốt nhất bạn có thể làm là thu thập một loạt các chuỗi định dạng khác nhau và cố gắng mỗi người cho đến khi bạn có được một trận đấu ...

8

Chẳng gì đó trong thư viện API chuẩn là. Natty là thư viện cố gắng điều này, nhưng bạn nên biết rằng điều này chỉ có thể là một "nỗ lực tốt nhất", vì những thứ như 2/1/2012 chỉ đơn giản là mơ hồ: không có thông tin về định dạng, không thể quyết định được Ngày 2 tháng 2 hoặc ngày 2 tháng 1.

+0

Đá nguyên sinh. Cảm ơn – Kirby

2

hãy thử DateFormat với Định dạng DateFormat.MEDIUM và SHORT mặc định.

public static void main(String[] args) { 
    // Make a String that has a date in it, with MEDIUM date format 
    // and SHORT time format. 
    String dateString = "Nov 4, 2003 8:14 PM"; 

    // Get the default MEDIUM/SHORT DateFormat 
    DateFormat format = 
     DateFormat.getDateTimeInstance(
     DateFormat.MEDIUM, DateFormat.SHORT); 

    // Parse the date 
    try { 
     Date date = format.parse(dateString); 
     System.out.println("Original string: " + dateString); 
     System.out.println("Parsed date : " + 
      date.toString()); 
    } 
    catch(ParseException pe) { 
     System.out.println("ERROR: could not parse date in string \"" + 
      dateString + "\""); 
    } 

snipped từ http://javatechniques.com/blog/dateformat-and-simpledateformat-examples/

On ngoại lệ bạn phải quyết định những gì cần làm tiếp theo, bạn có thể xây dựng một hệ thống các Parsing trys. như:

SimpleDateFormat df1 = new SimpleDateFormat("dd/MM/yyyy"); 
SimpleDateFormat df2 = new SimpleDateFormat("dd-MM-yyyy"); 

df1.parse(..) 
df2.parse(..) 

v.v.

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