2013-09-23 55 views
5

Hiện tại tôi đang sử dụng phương thức set không được dùng nữa của java.util.Date. Khi tôi muốn di chuyển ra khỏi nó, các lựa chọn thay thế và những lợi thế nào họ có?Các lựa chọn thay thế cho java.util.Date

Tôi cần có số Date được đặt thành hôm nay, nửa đêm cho truy vấn HQL chọn mọi thứ đã xảy ra hôm nay.

Hiện nay tôi sử dụng:

Date startingDate = new Date(); 
startingDate.setHours(0); 
startingDate.setMinutes(0); 
startingDate.setSeconds(0); 
+2

Vui lòng đọc javadoc ... đề cập rõ ràng rằng phương thức 'Lịch.set' là thay thế – sanbhat

+0

Nếu bạn mô tả trừu tượng hơn những gì bạn muốn làm, bạn có thể đưa ra lời khuyên trực tiếp hơn. –

+0

Tôi đang sử dụng biến ngày này trong truy vấn Hibernate để tìm kiếm các bản ghi được tạo vào cùng ngày bắt đầu từ 12:00 sáng. –

Trả lời

7

Lưu ý: Câu trả lời này rất có thể không còn chính xác cho Java 8 và hơn thế nữa, có một better date/calendar API bây giờ.

Phương án thay thế tiêu chuẩn đang sử dụng đối tượng Calendar.

Calendar cal = Calendar.getInstance(); // that is NOW for the timezone configured on the computer. 
cal.set(Calendar.HOUR, 0); 
cal.set(Calendar.MINUTES, 0); 
cal.set(Calendar.SECONDS, 0); 
Date startingDate = cal.getTime(); 

Calendar có lợi thế khi không có thư viện bổ sung và được hiểu rộng rãi. Đây cũng là lựa chọn tài liệu từ Javadoc của Date

Các tài liệu của Calendar có thể được tìm thấy ở đây: Javadoc

Calendar có một điểm nguy hiểm (đối với không thận trọng) và đó là after/before phương pháp. Họ lấy một số Object nhưng sẽ chỉ xử lý chính xác các đối tượng Calendar. Hãy chắc chắn để đọc Javadoc cho các phương pháp này chặt chẽ trước khi sử dụng chúng.

Bạn có thể chuyển đổi Calendar Đối tượng theo cách tương tự như thêm ngày (cal.add(Calendar.DAY_OF_YEAR, 1);) hoặc "cuộn" trong tuần (cal.roll(Calendar.DAY_OF_WEEK, 1);) và các loại tương tự. Hãy đọc mô tả lớp học trong Javadoc để có được bức tranh đầy đủ.

+2

Và phương thức '# set' trong đó: http://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html#set(int, int, int, int, int, int) – RJo

3

Giải pháp thay thế tốt nhất là sử dụng Joda Time API:

Date date = new DateMidnight().toDate();  // today at 00:00 

Để tránh to-be phản DateMidnight:

Date date = new DateTime().withMillisOfDay(0).toDate(); 
+0

bạn có thể thêm mã để hiển thị cách làm những gì OP đã nói với Joda không? –

+0

DateMidnight() không được dùng trong phiên bản joda mới nhất –

+0

Đúng vậy. Xem chỉnh sửa của tôi :) –

0

Bạn có thể sử dụng Joda ngày thư viện, bạn sẽ nhận được rất nhiều sự linh hoạt với cái đó. Nếu không, bạn có thể sử dụng java.util.Calendar để tạo ngày tùy chỉnh.

0

Ngày không xử lý quốc tế đúng cách, đó là lý do tại sao nó không được chấp nhận.

Trước JDK 1.1, lớp Ngày có hai hàm 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. Tính đến 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. Các phương thức tương ứng trong Ngày không được chấp nhận.

Giải pháp thay thế đơn giản nhất là sử dụng java.util.Calendar thay vì:

Calendar calendar = Calendar.getInstance(); // get a calendar instance (current) 

và cuộc gọi calendar.set (...) phương pháp.