2012-01-04 71 views
7

Tôi muốn nhận số tuần trong một năm nhất định. Mặc dù 52 được chấp nhận là câu trả lời chung trên toàn thế giới, các lịch cho 2015, 20202026 thực sự có 53 tuần.tính số tuần trong một năm nhất định

Có cách nào để tôi có thể tính toán điều này hoặc bất kỳ chức năng nào sẽ giúp tôi không?

+0

Nhận xét chung cho tất cả những câu trả lời không chính xác nhưng rất hữu ích để biết: Để hiểu lý do lớp Lịch trả về 53 cho "số tuần trong năm", bạn phải hiểu cách 'getFirstDayOfWeek() 'và' getMinimalDaysInFirstWeek() 'phương thức được sử dụng trong tính toán. Nếu "ngày đầu tiên của tuần" được chỉ định là thứ Hai chẳng hạn và "ngày tối thiểu trong tuần đầu tiên" là 4 và thứ Hai đầu tiên của năm là vào ngày 5 tháng 1, thì tuần trước ngày 5 tháng 1 được phân loại là một phần của năm. –

Trả lời

11

Theo bài viết wikipedia trên ISO week date format, Bạn có thể tính toán bằng cách sử dụng mã sau.

Calendar cal = Calendar.getInstance(); 
    cal.set(Calendar.YEAR, 2015); 
    cal.set(Calendar.MONTH, Calendar.DECEMBER); 
    cal.set(Calendar.DAY_OF_MONTH, 31); 

    int ordinalDay = cal.get(Calendar.DAY_OF_YEAR); 
    int weekDay = cal.get(Calendar.DAY_OF_WEEK) - 1; // Sunday = 0 
    int numberOfWeeks = (ordinalDay - weekDay + 10)/7; 
    System.out.println(numberOfWeeks); 
+1

thanx Manjula. Bằng cách nào đó vấn đề của tôi đã được sửa chữa tự động. Tôi nghĩ rằng lớp Lịch không xem xét tuần 53. (không có ý tưởng, những gì định dạng ngày nó sau ...). Nhưng calendar.set (Calendar.WEEK_OF_YEAR, 52); calendar.set (Calendar.YEAR, 2015); SimpleDateFormat formatter = new SimpleDateFormat ("ddMMM yyyy"); Ngày bắt đầuDate = calendar.getTime(); calendar.add (Calendar.DATE, 6); Ngày kết thúcDate = calendar.getTime(); cho tôi ngày bắt đầu và kết thúc trong tuần là ngày 27 tháng 12 năm 2015 & ngày 2 tháng 1 năm 2016. :) :) (những ngày này tôi đã mong đợi cho tuần 53, đó là lý do cho chuỗi câu hỏi này .. :)) – AndroidGuy

+0

Điều này thực sự giới thiệu một lỗi. Tôi đã thử nó: cho năm 2016, nó trở lại 52, nhưng Lịch xem xét nó có 53 tuần. Nó thực sự có 53 tuần vì nó bắt đầu với một thứ năm. Tôi xem xét chức năng của bạn: Tôi sẽ đăng nó xuống dưới đây. Xin vui lòng chỉnh sửa câu trả lời của bạn để loại bỏ lỗi này :) –

4
Calendar cal = Calendar.getInstance(); 
    cal.set(Calendar.YEAR, 2015); 
    cal.set(Calendar.MONTH, Calendar.DECEMBER); 
    cal.set(Calendar.DAY_OF_MONTH, 31); 
    System.out.println(cal.get(Calendar.WEEK_OF_YEAR)); 
+1

Nó không hoạt động hàng năm. Ngay cả ví dụ của bạn cũng trả về "1" thay vì 53. –

+1

Nhưng đó là tuần 01. Số tuần được xác định trong ISO-8601. Tuần thứ 1 là ngày thứ năm đầu tiên của năm. –

10

Bạn có thể mã hóa chính mình với các thông tin sau từ ISO week date.

Tính trung bình, mỗi năm có 53 tuần mỗi 5,6 năm.

71 năm sau trong chu kỳ 400 năm (thêm 2000 năm hiện tại) có 53 tuần. Số năm không được liệt kê có 52 tuần.

004, 009, 015, 020, 026, 032, 037, 043, 048, 054, 060, 065, 071, 076, 082, 088, 093, 099, 105, 111, 116, 122, 128, 133, 139, 144, 150, 156, 161, 167, 172, 178, 184, 189, 195, 201, 207, 212, 218, 224, 229, 235, 240, 246, 252, 257, 263, 268, 274, 280, 285, 291, 296, 303, 308, 314, 320, 325, 331, 336, 342, 348, 353, 359, 364, 370, 376, 381, 387, 392, 398.

Bạn có thể sử dụng thông tin trên để trả lại 52 hoặc 53 tương ứng :)

3

tôi muốn cung cấp cho quan điểm của tôi về việc sử dụng kể từ Ngày API mới trong Java 8 với tư thế sẵn sàng sau đây để chạy mã:

private static long getNumberOfWeeksInYear(LocalDate date) { 
    LocalDate middleOfYear = date.withDayOfMonth(1).withMonth(6); 
    return middleOfYear.range(WeekFields.ISO.weekOfWeekBasedYear()).getMaximum(); 
} 

public static void main(String[] args) { 
    for (int year = 2000; year < 2400; year++) { 
     long numberOfWeeks = getNumberOfWeeksInYear(LocalDate.of(year, 1, 1)); 
     if (numberOfWeeks != 52) { 
      System.out.println(year + " has " + numberOfWeeks + " weeks"); 
     } 
    } 
} 

Đầu ra là:

2004 có 53 tuần
2009 có 53 tuần
2015 có 53 tuần
2020 có 53 tuần
2026 có 53 tuần
2032 có 53 tuần.210 ...

Và vân vân ...

Bí quyết date.withDayOfMonth(1).withMonth(6); được vì bỏ qua điều này dẫn đến sản lượng hơi khác nếu LocalDate.of(year, 1, 1) được truyền:

2004 có 53 tuần
2005 đã 53 tuần
...

Tôi vẫn còn mới với API Java 8 ngày, nhưng tôi khá chắc chắn hành vi này là vì uase 2005-01-01 là một phần của tuần 53 của năm 2014. Điều này làm cho số date.range(WeekFields.ISO.weekOfWeekBasedYear()).getMaximum() trả lại số tuần cho năm dựa trên tuần của năm 2014.

1

Link to answer

gregorianCalendar.set(year, 12, 31); 
int totalWeeks = gregorianCalendar.getMaximum(Calendar.WEEK_OF_YEAR); 
5

nhanh hai lót:

Calendar calendar = Calendar.getInstance(); 
Integer weeksOfYear = calendar.getActualMaximum(Calendar.WEEK_OF_YEAR); 
+1

Nó sẽ được tốt đẹp để xem một lời giải thích chi tiết hơn về phương pháp này. 'getActualMaximum' lặp lại đếm tổng số dựa trên thời gian hiện tại, trong khi' getMaximum' chỉ trả về giá trị lớn nhất của trường đó. Vì vậy, 'getActualMaximum' thực sự là câu trả lời cho câu hỏi này. – Yeti

+0

Đây phải là câu trả lời được chấp nhận! –

1

@Manjula Weerasinge câu trả lời thực sự giới thiệu một lỗi cho năm 2016. Đây là một giải pháp tốt hơn.

Calendar cal = Calendar.getInstance(); 
cal.set(Calendar.YEAR, year); 
cal.set(Calendar.MONTH, Calendar.JANUARY); 
cal.set(Calendar.DAY_OF_MONTH, 1); 
GregorianCalendar gregorianCalendar = new GregorianCalendar(); 

int weekDay = cal.get(Calendar.DAY_OF_WEEK) - 1; 
if (gregorianCalendar.isLeapYear(year)){ 
    if (weekDay == Calendar.THURSDAY || weekDay == Calendar.WEDNESDAY) 
     return 53; 
    else 
     return 52; 
} else { 
    if (weekDay == Calendar.THURSDAY) 
     return 53; 
    else 
     return 52; 
} 
1

Phương pháp này tính số tuần theo ISO sử dụng thư viện thời gian Joda.

import org.joda.time.DateTime; 
    import org.joda.time.DateTimeZone; 

    public static int weeksInYear(int year) { 
     return new DateTime(DateTimeZone.forID("America/Los_Angeles")) 
      .withWeekyear(year + 1) 
      .withWeekOfWeekyear(1) 
      .minusWeeks(1) 
      .getWeekOfWeekyear(); 
    } 
Các vấn đề liên quan