以下是我用来计算给定月份的周开始日期和结束日期的代码。 假设周开始日是星期一,星期结束日是星期日。 例如,2013年1月将有5周。 如果月份从星期日开始 - 忽略那一天
2013年1月 第一周 - 2012年12月31日至2013年1月6日 第二周 - 2013年1月7日至2013年1月13日 第三周 - 2013年1月14日至2013年1月20日 第四周 - 2013年1月21日至2013年1月27日 第五周 - 2013年1月28日至2013年2月3日
public static void main(String[] args) {
List<List<String>> weekdates = getNumberOfWeeks(2013, Calendar.JULY);
for(List<String> weekDatesLoop:weekdates){
System.out.println("Start day: "+weekDatesLoop.get(0).toString());
System.out.println("End day: "+weekDatesLoop.get(1).toString());
}
}
public static List<List<String>> getNumberOfWeeks(int year, int month) {
System.out.println("Month Id: "+month);
month = month-1;
System.out.println("Month Id: " + month);
SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
List<List<String>> weekdates = new ArrayList<List<String>>();
List<String> dates = new ArrayList<String>();
Calendar c = Calendar.getInstance();
c.set(Calendar.YEAR, year);
c.set(Calendar.MONTH, month);
c.set(Calendar.DAY_OF_MONTH, 1);
dates.add(format.format(c.getTime()));
//int numOfWeeksInMonth = 1;
while (c.get(Calendar.MONTH) == month) {
//System.out.println(c.get(Calendar.DAY_OF_WEEK) );
if (c.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
dates.add(format.format(c.getTime()));
weekdates.add(dates);
}
else if (c.get(Calendar.DAY_OF_WEEK) == Calendar.MONDAY) {
dates = new ArrayList<String>();
dates.add(format.format(c.getTime()));
//numOfWeeksInMonth++;
}
c.add(Calendar.DAY_OF_MONTH, 1);
}
if(dates.size() < 2){
c.add(Calendar.DAY_OF_MONTH, -1);
dates.add(format.format(c.getTime()));
weekdates.add(dates);
}
System.out.println(weekdates);
return weekdates;
}
我还在努力。 任何人都可以帮我解决这个问题吗?
答案 0 :(得分:1)
一种可能的解决方案可能是不重新发明轮子并使用JodaTime或类似的库。例如,您可以使用DateTime
上的dayOfWeek()功能获取您所获得的信息。
答案 1 :(得分:1)
我通过以下代码获得答案
List<List<String>> getNumberOfWeeks(int year, int month) {
SimpleDateFormat format = new SimpleDateFormat("dd-MM-yyyy");
List<List<String>> weekdates = new ArrayList<List<String>>();
List<String> dates;
Calendar c = Calendar.getInstance();
c.set(Calendar.YEAR, year);
c.set(Calendar.MONTH, month);
c.set(Calendar.DAY_OF_MONTH, 1);
while (c.get(Calendar.MONTH) == month) {
dates = new ArrayList<String>();
while (c.get(Calendar.DAY_OF_WEEK) != Calendar.MONDAY) {
c.add(Calendar.DAY_OF_MONTH, -1);
}
dates.add(format.format(c.getTime()));
c.add(Calendar.DAY_OF_MONTH, 6);
dates.add(format.format(c.getTime()));
weekdates.add(dates);
c.add(Calendar.DAY_OF_MONTH, 1);
}
System.out.println(weekdates);
return weekdates;
}
答案 2 :(得分:1)
您使用的是可怕的日期时间类,而这些类早已被JSR 310中定义的现代 java.time 类取代了。现在,这项工作要容易得多。
YearMonth
YearMonth
类代表整个特定的月份。使用Month
枚举指定月份。
YearMonth ym = YearMonth.of( 2013 , Month.JANUARY ) ;
LocalDate
获取本月的第一天。
LocalDate firstOfMonth = ym.atDay( 1 ) ;
TemporalAdjuster
获取上一个星期一,如果是星期一,则保留该日期。
TemporalAdjuster ta = TemporalAdjusters.previousOrSame( DayOfWeek.MONDAY ) ;
LocalDate previousOrSameMonday = firstOfMonth.with( ta ) ;
然后一次循环一周。
LocalDate endOfMonth = ym.atEndOfMonth() ;
LocalDate weekStart = previousOrSameMonday ;
do {
LocalDate weekStop = weekStart.plusDays( 6 ) ;
System.out.println( "Week: " + weekStart + " to " + weekStop ) ;
// Set up the next loop.
weekStart = weekStart.plusWeeks( 1 ) ;
} while ( ! weekStart.isAfter( endOfMonth ) ) ;
请参阅此code run live at IdeOne.com。
周:2012年12月31日星期一至2013年1月6日星期日
周:2013年1月7日星期一至2013年1月13日星期日
周:2013年1月14日星期一至2013年1月20日星期日
周:2013年1月21日星期一至2013年1月27日星期日
周:2013年1月28日星期一至2013年2月3日星期日
顺便说一句,您可能想了解并考虑使用ISO 860 standard definition of a week。然后使用YearWeek
库的ThreeTen-Extra类。