2013-02-18 35 views
8

Tôi cố gắng lấy ngày hôm qua. Vì vậy, tôi viết chức năng tiếp theo:Bắt ngày hôm qua - Phương thức getDate() từ loại Ngày không được chấp nhận

public String getYestrday() { 
    DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); 
    Date date = new Date(); 
    return dateFormat.format(date.getDate() - 1); 
} 

Nhưng nó mang lại cho tôi những cảnh báo tiếp theo:

The method getDate() from the type Date is deprecated 

và nó không làm cho nó hoạt động.

Cảm ơn sự giúp đỡ của bạn.

+1

Văn bản deprecation gợi ý cho 'Calendar' nếu bạn đọc nó hoàn toàn –

Trả lời

16

Date#getDate() là phương pháp không dùng nữa sau JDK 1.1. Bạn nên sử dụng Calendar lớp thay vì thao tác ngày.

Từ API:

Trước JDK 1.1, Ngày lớp có hai chức năng bổ sung. Nó cho phép diễn giải các ngày theo năm, tháng, ngày, giờ, phút, và các giá trị thứ hai. Nó cũng cho phép định dạng và phân tích cú pháp của ngày chuỗi. Thật không may, API cho các chức năng này không tuân theo để quốc tế hóa. Kể từ JDK 1.1, lớp Lịch phải là được sử dụng để chuyển đổi giữa các trường ngày và giờ và lớp DateFormat nên được sử dụng để định dạng và phân tích chuỗi ngày tháng. Các phương thức tương ứng trong Ngày không được chấp nhận.

Nó cũng được ghi nhận rõ ràng trong API sử dụng Date#getDate() sử dụng Calendar#get(Calendar.DATE);

Deprecated. Tính đến JDK phiên bản 1.1, thay thế bằng Calendar.get (Calendar.DAY_OF_MONTH)

Calendar cal = Calendar.getInstance(); 
cal.add(Calendar.DATE, -1); 
return dateFormat.format(cal.getTime()); 
+3

1 để tránh các thư viện bổ sung cho một nhiệm vụ nhỏ. Hoặc là 'Calendar.DAY_OF_MONTH' hoặc' Calendar.DATE' sẽ làm, chúng là từ đồng nghĩa. – Gamb

1

Sử dụng java.util.Calendar để làm điều đó. Hoặc thử JODA.

0

bạn có thể sử dụng Calendar lớp để làm nhiệm vụ giống nhau:

Calendar c = new Calendar(); 
//c.add(Calendar.DAY_OF_MONTH, -1); 
Date d = c.getTime(); 
+0

constructor rỗng của java.util.Calendar được bảo vệ. Sử dụng Calendar.getInstance(). GetTime(); thay thế – BlondCode

1

Tránh java.util.Date & .Calendar

accepted answer là chính xác. Tuy nhiên, các lớp java.util.Date và .Calendar nổi tiếng là rắc rối. Tránh chúng. Sử dụng Joda-Time hoặc java.time package mới (trong Java 8).

riêng Date-Time Manipulation Từ Formatting

Ngoài ra, các mã trong câu hỏi trộn công việc ngày-thời gian với định dạng. Phân tách các tác vụ đó để làm cho mã của bạn rõ ràng và thử nghiệm/gỡ lỗi dễ dàng hơn.

Múi giờ

Múi giờ rất quan trọng trong công việc ban ngày. Nếu bạn bỏ qua vấn đề này, múi giờ mặc định của JVM sẽ được áp dụng. Thực hành tốt hơn là luôn luôn chỉ định thay vì dựa vào mặc định. Ngay cả khi bạn muốn mặc định, hãy gọi một cách rõ ràng getDefault.

Ngày bắt đầu được xác định theo múi giờ. Một ngày mới bắt đầu ở Paris sớm hơn ở Montréal. Vì vậy, nếu bằng "ngày hôm qua" bạn có nghĩa là thời điểm đầu tiên của ngày đó, sau đó bạn nên (a) chỉ định một múi giờ, và (b) gọi withTimeAtStartOfDay.

Joda-Time

Mã ví dụ trong Joda-Time 2.3.

DateTimeZone timeZone = DateTimeZone.forID("Europe/Paris"); 
DateTime today = DateTime.now(timeZone); 

Hoặc chuyển đổi từ đối tượng java.util.Date.

DateTime today = new DateTime(myJUDate, timeZone); 

Trừ một ngày để đến ngày hôm qua (hoặc ngày trước).

DateTime yesterday = today.minusDays(1); 
DateTime yesterdayStartOfDay = today.minusDays(1).withTimeAtStartOfDay(); 

Theo mặc định, chuỗi phân tích cú pháp/tạo Joda-Thời gian và java.time theo định dạng ISO 8601.

String output = yesterdayStartOfDay.toString(); // Uses ISO 8601 format by default. 

Sử dụng một định dạng cho một ngày đầy đủ như bốn năm chữ số, hai chữ số tháng trong năm, và hai ngày chữ số của tháng (yyyy-MM-dd). Một trình định dạng như vậy đã được định nghĩa trong Joda-Time.

String outputDatePortion = ISODateFormat.date().print(yesterdayStartOfDay); 
0

công trình sau cho tôi

int date = Calendar.getInstance().get(Calendar.DAY_OF_MONTH); 
Các vấn đề liên quan