本工具类是基于Calendar类编写的,由于笔者水平有限,有不足之处欢迎大家批评指正!谢谢!
工具类提供两个入参,指定年份 和 指定输出日期字符串的格式
package com.useCalendar;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
/**
* 获取各种各样需求的的日期们
* @author liangy
*
*/
public class GetDatesUtil {
/**
* 获取指定年份的所有周末的日期,以字符串集合返回
* @param year 传入“thisYear” 自动按今年处理;传入形如yyyy 格式的字符串按指定年份处理,例如“2008”
* @param pattern 返回字符串格式,可以指定型如“yyyy-MM-dd”
* @return List集合,集合中字符串按照入参pattern生成
* @throws ParseException 转型异常,您输入的入参若不是型如yyyy类型的会抛此异常
*/
public static List<String> getWeekendsOfTheYear(String year,String pattern) throws ParseException{
//声明并初始化List
List<String> list = new ArrayList<String>();
//声明并初始化日期转型工具
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
//声明并初始化欲处理年份(目标年份)对应的Calendar
Calendar calendar = Calendar.getInstance();
//算法是按照向后递增天数进行统计,需要设定初始日期为元月一号
if(year=="thisYear"){//按今年处理
calendar.set(Calendar.DAY_OF_YEAR, 1);
calendar.set(Calendar.HOUR_OF_DAY, 1);
}else{//按指定年份处理
Date targetDate = (new SimpleDateFormat("yyyy")).parse(year);//SimpleDateFormat只设定年份默认日期为元月一号
calendar.setTime(targetDate);
}
//以克隆方式生成另一个Calendar实例。代表下一年元月一号,作为递增上限
Calendar calendarUpperLimit =(Calendar) calendar.clone();
calendarUpperLimit.set(Calendar.YEAR,calendarUpperLimit.get(Calendar.YEAR)+1);
//如果元月一号为星期日
if(calendar.get(Calendar.DAY_OF_WEEK)==Calendar.SUNDAY){
//将元月一号的日期字符串先添加至集合中
String dayOfNewYear= sdf.format(calendar.getTime());
list.add(dayOfNewYear);
}
//定位到目标年的第一个星期六
calendar.add(Calendar.DAY_OF_YEAR, Calendar.SATURDAY-calendar.get(Calendar.DAY_OF_WEEK));
String saturday;
String sunday;
for(;calendar.before(calendarUpperLimit);calendar.add(Calendar.DAY_OF_YEAR, 6))
{
saturday= sdf.format(calendar.getTime());
list.add(saturday);
calendar.add(Calendar.DAY_OF_YEAR, 1);
if(calendar.get(Calendar.YEAR)==calendarUpperLimit.get(Calendar.YEAR))
//出现此情况的唯一可能性就是目标年的最后一天是周六,接下来的周日是下一年,往后的迭代要放弃。
continue;
sunday= sdf.format(calendar.getTime());
list.add(sunday);
}
return list;
}
}