问题
I got below code on stackoverflow which return total number of week in current year, but it is hardcoded which'll not work on 2014 and 2016. How I get total number of week in current year dynamically???
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);
I did like this just check it is current method?
Calendar cal = Calendar.getInstance();
int year = cal.get(Calendar.YEAR);
cal.set(Calendar.YEAR, year);
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:
Use the below code
Calendar mCalendar = new GregorianCalendar();
mCalendar.set(Calendar.YEAR, 2014); // Set only year
mCalendar.set(Calendar.MONTH, Calendar.DECEMBER); // Don't change
mCalendar.set(Calendar.DAY_OF_MONTH, 31); // Don't change
int totalWeeks = mCalendar.get(Calendar.WEEK_OF_YEAR);
Don't care about 30, 28 and 29 days of month. Last day of a year (Any year) is always 31 Dec. So you need to set that day. And mCalendar.get(Calendar.WEEK_OF_YEAR) will return the total weeks in that year.
Update for dynamic way
private int getTotalWeeksInYear(int year) {
Calendar mCalendar = new GregorianCalendar();
mCalendar.set(Calendar.YEAR, year); // Set only year
mCalendar.set(Calendar.MONTH, Calendar.DECEMBER); // Don't change
mCalendar.set(Calendar.DAY_OF_MONTH, 31); // Don't change
return mCalendar.get(Calendar.WEEK_OF_YEAR);
}
// Call as
int totalWeeks = getTotalWeeksInYear(2014);
Looking for bug in above code. By the time you can use below code that is working fine
private int getTotalWeeksInYear(int year) {
Calendar mCalendar = new GregorianCalendar(TimeZone.getDefault());
mCalendar.setFirstDayOfWeek(Calendar.MONDAY);
// Workaround
mCalendar.set(year,
Calendar.DECEMBER,
31);
int totalDaysInYear = mCalendar.get(Calendar.DAY_OF_YEAR);
System.out.println(totalDaysInYear);
int totalWeeks = totalDaysInYear / 7;
return totalWeeks;
}
回答2:
just use current year in this method:
int year = Calendar.getInstance().get(Calendar.YEAR);
cal.set(Calendar.YEAR, year);
Leave rest the same as in your example.
回答3:
I have a DatePickerFragment, its onDateSet function
public void onDateSet(DatePicker view, int year, int month, int day) {
((Main) getActivity()).setWeek(year, month, day);
}
only returns year, month and day only. So I have to do the following to get the week.
public void getWeek(int year, int month, int day){
final Calendar c = Calendar.getInstance();
c.set(year, month, day);
int week = c.get(Calendar.WEEK_OF_YEAR);
}
回答4:
You can use something like
private Calendar getCalendar(int year, int month, int day) {
Calendar calendar = Calendar.getInstance(Locale.GERMAN);
calendar.setFirstDayOfWeek(Calendar.MONDAY);
calendar.set(year, month, day);
return calendar;
}
private int getTotalWeeksInYear(int year) {
return getCalendar(year, Calendar.DECEMBER, 31).get(Calendar.WEEK_OF_YEAR);
}
Remember that definition of Week of Year is local dependent. It means that in different locales returned value of get(Calendar.WEEK_OF_YEAR) will be different. For example in Locale.GERMAN according to DIN 1355-1 / ISO 8601 the first Week of Year is the week contains 4 or more days in the new year. For the Locale.US the first Week of Year is the week where the 1 January belongs to.
回答5:
the fastest way is: Very important to set properly the Calendar depending from where are you from, because of numbering of weeks is determined to given standards. For example in Europ is ISO 8061. It means that 1 week of the year beginn when 01.01.RRRR is Thursday or further, and week beginns from Monday.
GregorianCalendar gregorianCalendar = new GregorianCalendar(year,12,31);
gregorianCalendar.setFirstDayOfWeek(Calendar.MONDAY); // week beginn from Monday
gregorianCalendar.setMinimalDaysInFirstWeek(4); // 1week mininum from Thursday
int totalWeeks = gregorianCalendar.getMaximum(Calendar.WEEK_OF_YEAR);
回答6:
Why not to use getActualMaximum property of Calendar ?
private int getWeeksCount(final int year, final Locale locale)
{
Calendar calendar = Calendar.getInstance(locale);
calendar.set(Calendar.YEAR, year);
int totalWeekNumber = calendar.getActualMaximum(Calendar.WEEK_OF_YEAR);
return totalWeekNumber;
}
回答7:
You can use the Calendar.getActualMaximum(int) method to get the total number of weeks in the current year as follows:
int totalNumberOfWeeks = Calendar.getInstance().getActualMaximum(Calendar.WEEK_OF_YEAR);
Simple.
来源:https://stackoverflow.com/questions/18438332/how-to-get-the-total-number-of-weeks-in-the-current-year