2008-09-04 32 views
5

Tôi có một chuỗi chứa biểu diễn ngày tháng. Dường như:Bạn sẽ lập trình như thế nào Tạo một mẫu từ một ngày được lưu trữ trong một chuỗi?

Thu 30 tháng 11 19:00:00 EST 2006

Tôi đang cố gắng để tạo ra một đối tượng Date sử dụng SimpleDateFormat và có 2 vấn đề.

1.) Tôi không thể hình dung ra mô hình để mã hóa cứng các giải pháp vào các nhà xây dựng SimpleDateFormat

2.) Tôi không thể tìm thấy một cách để tôi có thể phân tích các chuỗi sử dụng API để xác định mô hình vì vậy tôi có thể tái sử dụng điều này cho các mẫu đầu ra ngày khác nhau

Nếu có ai biết giải pháp sử dụng API hoặc giải pháp tùy chỉnh, tôi sẽ đánh giá cao điều đó.

+0

FYI, các lớp ngày giờ phiền hà cũ như ['java.util.Date'] (https://docs.oracle.com/javase/8/docs/api/java/util/Date.html) , ['java.util.Calendar'] (https://docs.oracle.com/javase/8/docs/api/java/util/Calendar.html) và' java.text.SimpleTextFormat' hiện là [legacy ] (https://en.wikipedia.org/wiki/Legacy_system), được thay thế bởi [java.time] (https://docs.oracle.com/javase/8/docs/api/java/time/package- summary.html) các lớp học. Xem [Hướng dẫn của Oracle] (https://docs.oracle.com/javase/tutorial/datetime/TOC.html). –

Trả lời

7

Định dạng để vượt qua để SimpleDateFormat có thể được nhìn lên http://java.sun.com/javase/6/docs/api/java/text/SimpleDateFormat.html

new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy") 

Đối với câu hỏi thứ hai của bạn, tôi không biết về bất kỳ thư viện Java để tìm ra một định dạng ngày và phân tích nó mà không biết trong trước định dạng là gì.

2

Tôi không chắc chắn có cách nào dễ dàng để phân tích một ngày và làm việc ra mô hình của mình, nhưng tôi đã có thể nghĩ rằng mô hình cho người mình đăng tải sẽ là:

EEE MMM DD HH: mm: ss zzz yyyy

+0

Cảm ơn! Đó là mô hình hoạt động, tốt nhất tôi đã có thể tìm thấy bằng cách sử dụng google là "ddd MMM dd hh: mm: ss 'EST' yyyy" mà đã ném một ParseException. Hy vọng rằng đó cũng là một cách để lập trình xác định mô hình mặc dù. – Aaron

0

Bạn có yêu cầu mẫu cho ngày đã cho không? Nếu vậy, tôi nghĩ rằng điều này nên làm điều đó:

"EEE MMM d HH:mm:ss z yyyy" 

Hoặc bạn đang cố gắng thực hiện bất kỳ ngày được định dạng nào và suy ra định dạng và phân tích cú pháp không?

1

Như những người khác đã nói, mô hình có vẻ như nó nên

new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy" 

Đối với phân tích một ngày định dạng tùy ý, tôi không biết về bất kỳ thư viện mà thực hiện điều này trong Java. Nếu bạn muốn phát triển một thứ như vậy, tôi sẽ bắt đầu bằng cách xem hàm perl str2time.

0

Làm thế nào về:

EEE MMM dd HH:mm:ss zzz yyyy

Chỉ cần vượt qua chuỗi vào constructor của SimpleDateFormat. Để sử dụng đối tượng, chỉ cần gọi phương thức phân tích cú pháp đi qua trong chuỗi bạn muốn chuyển đổi thành Ngày tháng.

Bạn có thể có một cái nhìn tại địa chỉ:

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

2

Nếu bạn muốn làm bất cứ điều gì khác hơn là phân tích hoặc định dạng một ngày không có nhiều trên mạng để xử lý các mô hình tự. Cách đây một thời gian, tôi đã viết một thành phần Swing để nhập ngày vào một trường văn bản được định dạng. Bạn đã cung cấp một mẫu và nó di chuyển con trỏ nhập văn bản thông qua các phần tử của mẫu đó, chỉ cho phép các giá trị hợp lệ.

Là một phần của điều đó, tôi đã viết DateFormatParser available here as part of the OpenHarmonise open source project.

Phân tích ngày thành mẫu sẽ là một vấn đề cực kỳ thú vị để giải quyết. Bạn sẽ phải đưa ra các giả định nhất định (ví dụ: sử dụng: trong thời gian không phải ngày) nhưng bạn sẽ phải đối mặt với các vấn đề vĩnh cửu của 2 năm chữ số và sắp xếp ngày/tháng hoặc tháng/ngày.

0

Điều này không thực sự giống nhau, nhưng bạn có thể muốn xem một cái gì đó như JChronic, có thể xử lý ngôn ngữ tự nhiên vào các ngày. Vì vậy, ngày đầu vào có thể giống như "ngày mai" hoặc "hai tuần kể từ ngày thứ ba tới".

Điều này có thể không giúp gì cho ứng dụng của bạn, nhưng sau đó lại có thể.

1

Tôi phải nói rằng tôi tìm thấy câu hỏi khác rất thú vị. Có một vấn đề nghiêm trọng mặc dù - phân tích cú pháp này: 08/07/06! Nếu bạn giới hạn bản thân trên một tập hợp các định dạng mong muốn, bạn có thể giải quyết vấn đề bằng cách chơi xung quanh với regexps, bạn có thể xây dựng một loạt các mẫu mong muốn và sau đó ngắt chuỗi trên không gian hoặc bất kỳ thứ gì.

+0

Tôi đồng ý rằng chắc chắn có sự mơ hồ - đây là vấn đề phổ biến nhất với ngày tháng. Tuy nhiên, một giải pháp có thể là truyền phương thức lập trình một mẫu mặc định như mm-dd-yy để nó giả định trong trường hợp nó gặp một ngày không rõ ràng.Không cung cấp mặc định (null) cho tham số đó có thể làm cho nó thất bại bằng cách ném một ngoại lệ, vv Đây không phải là một giải pháp hoàn hảo, nhưng nó sẽ là hợp lý, đủ để sử dụng trong hầu hết các tình huống. – Aaron

2

Điều đáng biết là định dạng ngày bạn đã đưa ra không phải là một định dạng tùy ý. Nó là đầu ra của phương thức Date.toString() được xây dựng sẵn (ít nhất là ở miền địa phương của Anh và Hoa Kỳ). Không phải ngẫu nhiên, nó cũng là định dạng của lệnh unix 'date' (ít nhất là trên linux, và tôi cũng tin vào các triển khai khác) - mặc dù là pedantic, Date.toString() sẽ tạo ra một số ngày có chữ số bằng 0 unix ngày không.

Điều này có nghĩa là bạn có khả năng nhận định dạng nhập này khi bạn xuất ngày không định dạng thành trường có thể sửa đổi người dùng (ví dụ: trường INPUT HTML) và nhận lại không sửa đổi. Vì vậy, chỉ vì đầu vào đang ở định dạng này, không có nghĩa là người dùng sẽ nhập vào một nghìn định dạng tùy ý khác.

Tất nhiên, chúng vẫn có thể. Cách tôi xử lý đầu vào ngày nói chung là với một loạt các khối try/catch, nơi tôi thử nó chống lại một định dạng, sau đó khác, sau đó khác. Theo mặc định, khung tiêu chuẩn của chúng tôi hiện có tối đa khoảng 20 định dạng khác nhau. Tất nhiên nó vẫn chưa hoàn hảo; Tôi tìm thấy ai đó vào ngày khác "03 tháng 9" là ngày (viết tắt của tháng không chuẩn, và không có năm) và chúng tôi đã không xử lý kịch bản đó.

2

Xem Apache Commons 'DateUtils. Có một phương thức parseDate, mất String và nhiều mẫu của bạn để thử và kích hoạt một phiên bản Date.

3

Trình phân tích cú pháp ngày POJava org.pojava.datetime.DateTime là một trình phân tích cú pháp không thay đổi và mạnh mẽ hỗ trợ nhiều ngôn ngữ, múi giờ và định dạng.

Hơn hết, trình phân tích cú pháp là heuristic và không yêu cầu "định dạng" có sẵn để hoạt động. Bạn chỉ cần chuyển nó một chuỗi văn bản ngày tháng/ngày và nhận ra một java.util.Date!

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