2009-03-18 19 views
24

Tôi có mã cũ sử dụng new Date(dateString) để phân tích cú pháp chuỗi ngày. Biên dịch mã tạo cảnh báo không dùng nữa Date(java.lang.String) in java.util.Date has been deprecated.Một tương đương chính xác không được chấp nhận của Ngày (Chuỗi s) trong Java?

Javadoc khuyên bạn không nên sử dụng DateFormat.parse(), mặc dù lớp DateFormat không có phương thức tĩnh parse.

Bây giờ, tôi biết làm thế nào để sử dụng SimpleDateFormat, nhưng tôi muốn chắc chắn Tôi nhận được chính xác cùng một hành vi của deperecated Date constructor.

Trả lời

47

Dưới đây là dự đoán của tôi (tôi đã đăng như wiki cộng đồng, do đó bạn có thể bỏ phiếu lên nếu tôi là đúng):

Date parsed; 
try { 
    SimpleDateFormat format = 
     new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy"); 
    parsed = format.parse(dateString); 
} 
catch(ParseException pe) { 
    throw new IllegalArgumentException(pe); 
} 
+1

Vâng, đó là khá nhiều làm thế nào tôi muốn làm điều đó nếu tôi muốn có được chính xác cùng một hành vi. Lý do tại sao DateFormat.getInstance() tốt hơn là nó trả về trình định dạng phù hợp cho miền địa phương hiện tại. –

+4

Xin vui lòng, xin vui lòng không bao giờ, bao giờ làm một "mới IllegalgArgumentException()": O. Ít nhất là chuỗi ngoại lệ ban đầu (new IllegalArgumentException (pe)). – sleske

+0

Tôi đã phải sử dụng "SimpleDateFormat mới (" EEE MMM dd HH: mm: ss zzz yyyy ", Locale.ENGLISH);" để thực hiện công việc này - Chỉ trong trường hợp người khác đang gặp sự cố. – Nitek

2

DateFormat có các phương thức tĩnh trả về các phiên bản DateFormat. Tôi không biết cái nào (nếu có) có hành vi tương tự như Date(String s) nhưng ở đây bạn đi:

DateFormat.getInstance() 
DateFormat.getDateInstance() 
DateFormat.getTimeInstance() 
DateFormat.getDateTimeInstance() 
+1

Không ai trong số này dường như hoạt động – itsadok

2

Câu trả lời ngắn (trước khi điều tra thêm) là: không, nó không tương đương. phương thức khởi tạo Date (String toParse) tương đương với phương thức phân tích của lớp Date (cũng không được chấp nhận) ... Và javadoc của phương thức này yêu cầu:

Lưu ý rằng điều này hơi khác với cách diễn giải năm dưới 100 được sử dụng trong SimpleDateFormat.

Nếu đó là thay đổi duy nhất, tôi đoán bạn có thể tiếp tục theo cách này.

7

SimpleDateFormat là cách để thực hiện. Tuy nhiên, tôi có thể chỉ ra rằng bạn có thể cảm thấy bắt buộc phải định nghĩa một cá thể SimpleDateFormat và xây dựng các đối tượng Date bằng cách sử dụng nó. Nếu bạn làm như vậy, hãy cẩn thận rằng SimpleDateFormat không an toàn với luồng và bạn có thể tự phơi bày một số vấn đề có khả năng khó gỡ lỗi!

Tôi khuyên bạn nên tận dụng cơ hội này để xem Joda, đây là API tốt hơn (và thread-safe) tốt hơn nhiều. Nó tạo thành cơ sở của JSR-310, là Java Date API được đề xuất mới.

Tôi hiểu điều này là một chút công việc. Tuy nhiên nó có thể đáng giá cho rằng bạn đang có mã refactor tại thời điểm này.

3

Nếu bạn xem nguồn của phương thức Date.parse (String s) mà Nicolas đề cập đến, bạn sẽ thấy khó xây dựng định dạng ngày chính xác sao chép hành vi.

Nếu bạn chỉ muốn loại bỏ cảnh báo, bạn có thể đặt @SuppressWarnings({“deprecation”}) bên ngoài phương thức gọi hàm tạo Date (String).

Nếu bạn thực sự muốn đảm bảo truy cập trong tương lai hành vi này với các JRE trong tương lai, bạn có thể chỉ trích xuất phương thức từ nguồn JDK và đưa nó vào nguồn của riêng bạn. Điều này đòi hỏi phải đọc kỹ các giấy phép mã nguồn và xem xét đơn đăng ký của họ đối với dự án cụ thể của bạn và có thể không được chấp nhận.

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