2012-10-26 46 views
6

Sử dụng Lịch của Java hoặc mục khác, giả sử tôi đặt ngày thành 2012-10-26. Tôi muốn ngày này là ngày đầu tiên của năm. Có thể để có được số tuần của một ngày cụ thể của nói rằng đó là 2012-12-10- giả định rằng tuần đầu tiên của năm bắt đầu từ 2012-10-26?Thay đổi tuần đầu tiên của năm

Tôi biết câu hỏi của mình có vẻ kỳ lạ một chút, nhưng tôi có thể sử dụng bất kỳ đầu vào hữu ích nào.

Cảm ơn.

--Details

Tôi có một bảng cơ sở dữ liệu được gọi là WeeklySchedule. Trong bảng này, tôi có các cột bắt đầu từ Week1 đến Week52 và mỗi cột có một số dữ liệu về những ngày trong tuần đó. Thật không may, Week1 không thực sự là tuần đầu tiên của năm. Tôi cần thực hiện các tính toán của mình giả định rằng Week1 bắt đầu từ 2012-08-26.

+0

Hiển thị cho chúng tôi một số mã. – kosa

+1

Đã thử bất cứ điều gì? Ít nhất đã đi qua các tài liệu của 'Lịch'> –

+0

@Nambari tôi đã thêm một số chi tiết về vấn đề của tôi. Thật không may, tôi không có bất kỳ mã làm việc ngay bây giờ, bởi vì tôi không biết làm thế nào để đối phó với vấn đề này. – 629

Trả lời

2

Dưới đây là một cách tiếp cận sử dụng API Lịch:

private static final Calendar START_CAL = createAugust26th2012Cal(); 

public int getWeekNumber(Calendar someCal) { 
    int theWeek = someCal.get(Calendar.WEEK_OF_YEAR); 
    int weekCount = 0; 
    while (theWeek != START_CAL.get(Calendar.WEEK_OF_YEAR)) { 
     someCal.add(Calendar.WEEK_OF_YEAR, -1); 
     theWeek = someCal.get(Calendar.WEEK_OF_YEAR); 
     weekCount++; 
    } 
    return weekCount; 
} 

Hoặc bạn có thể nhận được diff (trong millis) giữa hai lịch và chia kết quả bằng của số millis trong một tuần:

Nếu bạn sử dụng cách tiếp cận này, đừng quên tính TimeZones và Daylight Saving Time.

Tôi không thể nhớ chính xác gì mã trông giống như để bù đắp cho DST, nhưng tôi nghĩ đó là một cái gì đó như thế này: (tôi có thể không hoàn toàn nhớ nếu bạn thêm bù đắp hoặc trừ đi bù đắp từ hai toán hạng)

private static final long ONE_WEEK_MILLIS = 1000 * 60 * 60 * 24 * 7; 

public int getWeeksBetween(Calendar calOne, Calendar calTwo) { 
    long millisOne = calOne.getTime().getTime(); 
    long millisTwo = calTwo.getTime().getTime(); 
    long offsetOne = calOne.getTimeZone().getOffset(millisOne); 
    long offsetTwo = calTwo.getTimeZone().getOffset(millisTwo); 
    long diff = (millisTwo - offsetTwo) - (millisOne + offsetOne); 
    return diff/ONE_WEEK_MILLIS; 
} 
+0

Thực ra, tôi đã sử dụng cách tiếp cận này, nhưng tôi nghĩ đó không phải là cách tiếp cận tốt nhất. Nên có một cách năng động khác để làm điều đó. – 629

+0

Tôi không chắc chắn lý do tại sao bạn mong chờ loại mã này tồn tại trong thư viện. Phải mất rất ít công sức để tự mình thực hiện. Cách tiếp cận khác tôi muốn đề nghị là để rút ngắn thời gian giữa hai ngày trong mili giây và chia cho số millis trong một tuần (sau đó làm tròn kết quả). Đừng quên tính đến múi giờ nếu bạn làm theo cách này! – jahroy

+0

+1 cho mã hoạt động. –

1

Tôi chưa bao giờ thấy chức năng tích hợp cho điều này, chỉ các cuộc gọi như Calendar.get(WEEK_OF_YEAR) hoặc Joda 's LocalDate.getWeekOfWeekyear(). java.util.Calendar (và Date) thường được coi là một thư viện xấu, so với một thư viện như Joda Time. This SO post có danh sách ưu và nhược điểm tốt.

Lưu ý rằng nếu bảng cơ sở dữ liệu của bạn áp dụng cho năm này qua năm khác lặp lại trong một năm, bạn có thể gặp rắc rối. Một số năm (71 years per 400, or about 1 every 5.6) có 53 tuần.

Với điều kiện trên, bạn có thể muốn giải quyết gần đúng, chẳng hạn như đếm số days between the two dates chia cho 7 (tất cả mod 52), sẽ giảm một lượng nhỏ mỗi năm hoặc tính (weekOfYear(date) - weekOfYear(startDate)) % 52. một tuần vào đầu năm dương lịch.

+0

+1 cho ghi chú của một số năm có 53 tuần. –

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