Tôi nhận được một số kết quả khó hiểu với SimpleDateFormat và tôi hy vọng rằng ai đó có thể làm sáng tỏ một số vấn đề. Đầu ra:SimpleDateFormat Tính toán tuần
Time = Mon Dec 27 00:00:00 PST 2010
2010-01 <--- THIS IS WHAT I DON'T UNDERSTAND
Start of week = Sun Dec 26 00:00:00 PST 2010
2010-01
End of Week = Sat Jan 01 23:59:59 PST 2011
2011-01
Tôi có nên xử lý "tuần" cuối cùng của năm kéo dài sang năm tiếp theo như trường hợp đặc biệt không? Hay đây là cách chính xác để giải thích điều này? Rõ ràng là khi cố gắng tổ chức tuần tuần tự, thứ tự không chính xác. Điều chỉnh giá trị ban đầu, ngày 25 tháng 12 năm 2005 được coi là tuần thứ 53. Tôi chưa xem Joda để xem liệu Joda có tạo ra kết quả tương tự hay không.
Mã liên quan:
private static Date getStartOfWeek(Date d) {
Calendar calendar = Calendar.getInstance();
calendar.clear();
calendar.setTime(d);
calendar.set(Calendar.DAY_OF_WEEK, calendar.getFirstDayOfWeek());
return calendar.getTime();
}
private static Date getEndOfWeek(Date d) {
Calendar calendar = Calendar.getInstance();
calendar.clear();
calendar.setTime(d);
calendar.add(Calendar.WEEK_OF_YEAR, 1);
calendar.set(Calendar.DAY_OF_WEEK, calendar.getFirstDayOfWeek());
calendar.add(Calendar.MILLISECOND, -1);
return calendar.getTime();
}
Calendar calendar = Calendar.getInstance();
calendar.clear();
calendar.set(2010, Calendar.DECEMBER, 27);
Date d = calendar.getTime();
Date start = getStartOfWeek(d);
Date end = getEndOfWeek(d);
SimpleDateFormat fmt = new SimpleDateFormat("yyyy-ww");
System.out.println("Time = " + d);
System.out.println(fmt.format(d));
System.out.println("Start of week = " + start);
System.out.println(fmt.format(start));
System.out.println("End of Week = " + end);
System.out.println(fmt.format(end));
Bối cảnh: Tôi thấy điều này khi sử dụng crosstab (ngày chia thành các nhóm tuần) trong JasperReports.
EDIT: Tôi đang sử dụng JDK 1.6.0_25
EDIT: Có vẻ như rằng tôi sẽ phải sử dụng Joda để có được kết quả chính xác. Để bắt đầu/kết thúc tuần, tôi đã sử dụng: LocalDate.withDayOfWeek
. Để truy xuất số năm và số tuần, tôi đã sử dụng DateTime.getWeekyear
và DateTime.getWeekOfWeekyear
.
+1 để đưa ra một vấn đề tinh tế trong biểu diễn ngày tháng. Xem câu trả lời của tôi dưới đây. –