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);
Văn bản deprecation gợi ý cho 'Calendar' nếu bạn đọc nó hoàn toàn –